如何使用SQL查询计算1月份第二个星期一相对于当前日期的日期?
以下是我所拥有的查询,如果当前日期是同一年但在即将到来的1月第二个星期一之前,则该查询不起作用。
declare @secondMondayOfJan date = dateadd(day , ((17 - datepart(dw,current_timestamp)) % 7) + 6, current_timestamp)
IF current_timestamp > @secondMondayOfJan
select @secondMondayOfJan as Deadline
ELSE
declare @firstDayOfNextYear date = datefromparts(year(current_timestamp)+1,1,1)
set @secondMondayOfJan = dateadd(day, ((17 - datepart(dw,@firstDayOfNextYear)) % 7) + 6, @firstDayOfNextYear)
select @secondMondayOfJan as Deadline
答案 0 :(得分:1)
这看起来非常详细,但希望使逻辑清除,并且不依赖于任何特定设置(例如DATEFIRST
或语言设置):
;With Nums(n) as (
select 0 union all select 1 union all select 2 union all select 3
union all select 4 union all select 5 union all select 6
), ThisAndNext as (
select
DATEADD(year,DATEDIFF(year,'20010101',GETDATE()),'20010108') as SecondWeek,
0 as Choose
union all
select
DATEADD(year,DATEDIFF(year,'20010101',GETDATE()),'20020108'),
1
), Combined as (
select DATEADD(day,n,SecondWeek) as Possible,Choose
from ThisAndNext cross join Nums
)
select top 1 Possible from Combined
where Possible >= DATEADD(day,DATEDIFF(day,0,GETDATE()),0)
and DATEPART(weekday,Possible) = DATEPART(weekday,'20150504')
order by Choose
Nums
只是一小组数字 - 如果您已经有一个数字表,可以用数字表中的选项替换。
ThisAndNext
找到今年和明年的第8个,分别为两行。
Combined
在今年8月和明年8月之间添加0到6天。
最后,我们从Combined
中选择第一个日期(以下要点与WHERE
子句的行对应)
DATEADD
/ DATEDIFF
模式的其他实例从GETDATE()
中移除时间元素)全部合在一起,这意味着我们选择了一个星期一的1月8日到14日之间的未来(或当前)日。如果你不想要"今天"要成为可能的结果,只需将>=
比较结果更改为>
。