场景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会是什么?
星期日开始,星期六结束。
答案 0 :(得分:2)
这是一种方法,使用day of week
选项(w
)DatePart
:
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())
。