SQL Server:日期自动化

时间:2016-10-12 16:33:26

标签: sql sql-server tsql

场景1 :当前年度

始终SQL代码需要选择当年的1月最后一个星期日。对于ex(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 :去年

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

SQL代码Scenario 2会是什么?

星期日开始,星期六结束。

1 个答案:

答案 0 :(得分:2)

这是一种方法,使用day of week选项(wDatePart

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天将是另一个日期。

编辑添加:上面的公式将返回1月的最后一天,如果最后一天不是星期日,则返回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())