如何计算1月份即将到来的第二个星期一相对于SQL当前日期的日期?

时间:2015-09-22 01:49:40

标签: sql reporting-services

如何使用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

1 个答案:

答案 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日之间的未来(或当前)日。如果你不想要"今天"要成为可能的结果,只需将>=比较结果更改为>