根据我们输入的日期获取最后3个星期四的日期

时间:2012-05-25 07:48:33

标签: sql sql-server tsql

我试图根据我给出的日期得到最后三个星期四的日期。如果我插入星期二的约会,但是在周五约会时却没有用,我说得对。我做的是:

select dt from (select *,ROW_NUMBER() over (order by(d.dt)) as rn from  
(SELECT Top 4 CONVERT(varchar, DATEADD(Month, -1, '5/29/2012')+number,101) as dt 
FROM master..spt_values WHERE TYPE ='p' AND 
DATEDIFF(d,DATEADD(Month, -1, '5/29/2012'),'5/29/2012') >= number 
AND DATENAME(w,DATEADD(Month, -1, '5/29/2012')+number) = 'Thursday') as d ) 
as nw where nw.rn>1

,我得到的输出是5/10/2012,2012年5月17日,2012年5月24日。

但是当我将日期更改为5/18/2012时,我得到的输出是

04/26 / 2012,05 / 03 / 2012,05 / 10/2012

但它应该是05 / 3,05 / 10,05 / 17 .....有什么问题或有其他方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:3)

只需将DATEADD(Month, -1,替换为DATEADD(Week, -4,,它就会在周五和周六开始工作。

说明:如果您减去一个月,它通常会减去30或31天,如果开始日期是星期五,星期六或(在31天的情况下是星期日),则会增加额外的星期四。之后,排名前四位的人排在名单的最后一个星期四。

编辑,只选择三个值:

select * from (select *,ROW_NUMBER() over (order by(d.dt)) as rn from   
(
   SELECT CONVERT(varchar, DATEADD(Week, -3, '5/25/2012')+number,101) as dt  
   FROM master..spt_values WHERE TYPE ='p' 
   AND DATEDIFF(d,DATEADD(Week, -3, '5/25/2012'), DATEADD(Day,-1,'5/25/2012')) >= number  
   AND DATENAME(w,DATEADD(Week, -3, '5/25/2012') + number) = 'Thursday') as d
)
as nw