每个月的最后一个星期三

时间:2016-07-12 15:08:19

标签: sql sql-server sql-server-2012

我需要在一系列日期的每个月的最后一个星期三工作。

我有计算上周三的代码,但我的cte似乎没有正确地逐步完成这几个月。

当前代码:

declare @S_Date date
declare @E_Date date

set @S_Date='2016-01-31'  --eomonth of first month
set @E_Date='2016-06-15'  --ides of last month ( can actually be any day that is
                          --not equal to or after the last Wednesday of the month)

;with LW(D_Date) as
    (
    select dateadd(dd,datediff(dd,0,@S_Date)/7*7+2,0) 
    union all
    select dateadd(dd,datediff(dd,0,eomonth(D_Date,1))/7*7+2,0)
    from LW
    where D_date<@E_Date
    )
select d_date
from LW

eomonth更改为

select dateadd(dd,datediff(dd,0,dateadd(mm,1,D_Date))/7*7+2,0)

似乎无法正常工作

预期结果:

  

2016年1月27日
  2016年2月24日
  2016年3月30日
  2016年4月27日
  2016年5月25日
  2016-06-29

4 个答案:

答案 0 :(得分:2)

以下是使用EOMONTH()DATEFROMPARTS()执行此操作的方法:

declare @S_Date date
declare @E_Date date

set @S_Date='2016-01-31'  --eomonth of first month
set @E_Date='2016-06-15'  --ides of last month ( can actually be any day that is
                          --not equal to or after the last Wednesday of the month)

;With Date (Date) As
(
    Select  DateFromParts(Year(@S_Date), Month(@S_Date), 1) Union All
    Select  DateAdd(Day, 1, Date) 
    From    Date
    Where   Date < EOMonth(@E_Date)
)
Select  Max(Date) As LastWednesday
From    Date
Where   DatePart(WeekDay, Date) = 4
Group By Year(Date), Month(Date)
Option  (MaxRecursion 0)
  

输出

LastWednesday
2016-01-27
2016-02-24
2016-03-30
2016-04-27
2016-05-25
2016-06-29

答案 1 :(得分:0)

这里有一个稍微不同的方法,没有分区...结果应该是相同的:

declare @S_Date date
declare @E_Date date

set @S_Date='2016-01-31'  --eomonth of first month
set @E_Date='2016-06-15'  --ides of last month ( can actually be any day that is
                          --not equal to or after the last Wednesday of the month)

;With Date (Date, WD) As
(
    Select  DateFromParts(Year(@S_Date), Month(@S_Date), 1), DatePart(WeekDay, DateFromParts(Year(@S_Date), Month(@S_Date), 1)) AS wd
    Union All
    Select  DateAdd(Day, 1, Date), DatePart(WeekDay, DateAdd(Day, 1, Date)) AS wd
      From    Date
      Where   Date < EOMonth(@E_Date)
)
Select  Max(Date) As LastWednesday
  From    Date
  Where   wd = 4
  group by MONTH(Date)
  Option  (MaxRecursion 0)

答案 2 :(得分:0)

你需要一个calendar table ..我有一个日历表,下面的屏幕截图显示了每个月的最后一个星期三检查或获取的简单程度..

使用的查询:

select * from dbo.calendar where year='2013' and wkdname='Wednesday'
and last=1

您可以根据自己的要求修改上述查询的输出:

enter image description here

答案 3 :(得分:0)

使用eomonth这是一个相当简单的解决方案。

declare @s_date date='2016-01-01',@e_date date='2016-12-31' --date range
;with eom_tbl as (--CTE
--anchor from start date
select EOMONTH(@s_date,0) eom,datepart(weekday,EOMONTH(@s_date,0)) dw
union all
--recursive query
select EOMONTH(eom,1) eom,datepart(weekday,EOMONTH(eom,1)) dw
from eom_tbl where eom<@e_date
)
select eom,dw,  
       --calculate last Wednesday (4)
       case when dw<4 then dateadd(dd,-3-dw,eom)
       else dateadd(dd,4-dw,eom) end lastWed,
       --extra check
       datepart(dw,case when dw<4 then dateadd(dd,-3-dw,eom)
       else dateadd(dd,4-dw,eom) end ) ddw
from eom_tbl