我试图根据我给出的日期得到最后三个星期四的日期。如果我插入星期二的约会,但是在周五约会时却没有用,我说得对。我做的是:
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 .....有什么问题或有其他方法可以做到这一点吗?
答案 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