2012-05-25 31 views
1

我試圖根據我給出的日期得到最後三個星期四的日期。如果我插入星期二的日期,但不適用於星期五的日期,我知道了。我做的是:根據我們輸入的日期獲取最後3個星期四的日期

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,5/17/2012,5/24/2012。

但是,當我將日期更改爲5/18/2012輸出我得到的是

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

但應05/3,05/10,05/17 .....有什麼不對或有其他方法可以做到這一點?

+0

http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html –

回答

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 
+0

感謝噸它的工作...我可以直接得到三個日期??截至目前正在獲取四個值,並採取三個忽略第一個記錄 – Karthik

+0

@ karthi我剛剛添加了一個解決方案,這樣做。 -1天是必要的,因爲如果你進入星期四,你會得到太多。 –

+0

感謝您的幫助:-) – Karthik

相關問題