1

我试图根据我给出的日期来获得最后三个星期四的日期。如果我插入星期二的日期但不适用于星期五的日期,那我就做对了。我所做的是:

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

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

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

2012 年 4 月 26 日、2012 年 5 月 3 日、2012 年 5 月 10 日

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

4

1 回答 1

3

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

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

编辑,只选择三个值:

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 
于 2012-05-25T08:35:33.237 回答