【问题标题】:SQL Server : date automate [closed]SQL Server:日期自动化[关闭]
【发布时间】:2016-10-12 16:33:26
【问题描述】:

场景 1:当年

SQL 代码始终需要选择当年一月的最后一个星期日。 例如(31-01-2016)

下面的 SQL 代码给出了上述问题的答案

select case when DatePart(w, DateAdd(d, 30, DATEADD(y, - DatePart(y, GETDATE()) + 1, convert(date, GetDate())))) = 1
        then DateAdd(d, 30, DATEADD(y, - DatePart(y, GETDATE()) + 1, Convert(date, GetDate())))
        else DateAdd(d, -DatePart(w, DateAdd(d, 30, DATEADD(y, - DatePart(y, GETDATE()) + 1, GetDate()))) + 1, DateAdd(d, 30, DATEADD(y, - DatePart(y, GETDATE()) + 1, convert(date, GetDate()))))
    end

情景 2:去年

代码始终需要选择上一年一月的最后一个星期日。前(01-02-2015)

请问场景 2 的 SQL 代码是什么?

一周从周日开始,到周六结束。

【问题讨论】:

  • 嗯.......什么?
  • 再次发布问题无助于澄清您之前提出的完全相同的问题......stackoverflow.com/questions/40001280/…
  • 如果我们将此标记为该副本的副本,并将该副本标记为该副本的副本,会发生什么情况。宇宙还存在吗?
  • @marc-s,@scsimon,@kritner,@habo,@lamak 我已经更新了我的问题。我希望它现在清楚了。能否请您删除“暂停”

标签: sql sql-server tsql


【解决方案1】:

这是一种方法,对DatePart 使用day of week 选项(w):

declare @StartDate date = GetDate()
declare @FirstDayofYear date = DATEADD(y, - DatePart(y, @StartDate) + 1, @StartDate)
declare @LastDayOfJanuary date = DateAdd(d, 30, @FirstDayofYear)

select case When DatePart(w, @LastDayofJanuary) = 1
        Then @LastDayofJanuary
        Else DateAdd(d, -DatePart(w, @LastDayOfJanuary) + 1, @LastDayOfJanuary)
    end

显然,您可以将@StartDate 更改为您想要的任何日期,包括去年的这个日期:

declare @StartDate date = DateAdd(yy, -1, GetDate())

或者,如果你想把它全部扩展成一个表达式,这里是GetDate()

 select case when DatePart(w, DateAdd(d, 30, DATEADD(y, - DatePart(y, GETDATE()) + 1, convert(date, GetDate())))) = 1
        then DateAdd(d, 30, DATEADD(y, - DatePart(y, GETDATE()) + 1, Convert(date, GetDate())))
        else DateAdd(d, -DatePart(w, DateAdd(d, 30, DATEADD(y, - DatePart(y, GETDATE()) + 1, GetDate()))) + 1, DateAdd(d, 30, DATEADD(y, - DatePart(y, GETDATE()) + 1, convert(date, GetDate()))))
    end

请注意,这假设您的机器设置为从星期日开始的一周。如果您的一周从另一天开始,您可能需要对此进行调整,因为第 1 天将是不同的日期。

编辑添加:上面的公式将返回一月的最后一天,如果最后一天不是星期日,则返回一月最后一天之前的星期日。

但是根据问题中给出的示例,OP 对 1 月最后一个星期日的定义可以延续到 2 月。对于这种情况,这里有一个更好的公式:

declare @StartDate date = GetDate()
declare @FirstDayofYear date = DATEADD(y, - DatePart(y, @StartDate) + 1, @StartDate)
declare @LastDayOfJanuary date = DateAdd(d, 30, @FirstDayofYear)

select case When DatePart(w, @LastDayofJanuary) = 1
    Then @LastDayofJanuary
    Else DateAdd(d, 7 - DatePart(w, @LastDayOfJanuary) + 1, @LastDayOfJanuary)
end

扩展版本是:

select case When DatePart(w, DateAdd(d, 30, DATEADD(y, - DatePart(y, GetDate()) + 1, GetDate()))) = 1
    Then DateAdd(d, 30, DATEADD(y, - DatePart(y, GetDate()) + 1, convert(date, GetDate())))
    Else DateAdd(
                d, 
                7 - DatePart(w, DateAdd(d, 30, DATEADD(y, - DatePart(y, GetDate()) + 1, GetDate()))) + 1, 
                DateAdd(d, 30, DATEADD(y, - DatePart(y, GetDate()) + 1, convert(date, GetDate())))
                )
end

将其转换为上一年的值

GetDate() 的所有实例替换为DateAdd(yy, -1, GetDate())

【讨论】:

  • 优秀的单一表达式适用于场景 1(在我的问题中)。任何想法敌人场景2(在我的问题中)好吗?
  • 优秀的单一表达式适用于场景 1(在我的问题中)。请对场景 2(在我的问题中)有任何想法吗?
  • 我已经编辑了我的问题以包含一个不同的公式,这将更适合您的情况(1 月的最后一个星期日可以在 1 月 31 日之后)。我还添加了生成上一年版本的说明。
  • 优秀。工作。非常感谢
  • 上面的查询给出了错误的结果,如果我运行上面给出的查询,示例 1:选择错误的日期假设当前日期是 - '2017-01-01' SQL 选择低于日期,在 '2017 之间-02-05' and '2016-12-31' ('Picks Start of the Next Year' and 'Last day (Saturday) of previous week') 示例 2:选择正确的日期假设当前日期为 - '2017-02- 12' SQL 选择以下日期,在 '2017-02-05' 和 '2017-02-11' 之间('选择明年开始'和'前一周的最后一天(星期六)')问题总是一月.请问如何修复示例1?任何更新的 SQL 查询?
猜你喜欢
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 2016-10-24
  • 2017-07-11
  • 2010-10-04
  • 2023-03-26
  • 2016-04-04
相关资源
最近更新 更多