繁体   English   中英

每个月的最后一个星期三

[英]Last Wednesday of every month

我需要计算日期范围内每个月的最后一个星期三。

我有用于计算最后一个星期三的代码,但我的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-01-27
2016-02-24
2016-03-30
2016-04-27
2016-05-25
2016-06-29

这是使用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

在没有分区的情况下,这里的方法略有不同...结果应该相同:

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)

您需要一个日历表 ..我有一个日历表,下面的屏幕截图显示了每个月的最后一个星期三的检查或获取有多么简单。

使用的查询:

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

您可以根据需要修改以上查询的输出:

在此处输入图片说明

对于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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM