我需要在一系列日期的每个月的最后一个星期三工作。
我有计算上周三的代码,但我的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
答案 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
您可以根据自己的要求修改上述查询的输出:
答案 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