这是一种方法,对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())。