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

私が得る出力は、2012 年 5 月 10 日、2012 年 5 月 17 日、2012 年 5 月 24 日です。

しかし、日付を2012年5月18日に変更すると、出力は次のようになります

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

しかし、それは 05/3、05/10、05/17 である必要があります.....何が間違っているか、これを行う他の方法はありますか?

4

1 に答える 1

3

に置き換えるだけDATEADD(Month, -1,DATEADD(Week, -4,、金曜日と土曜日に機能し始めます。

説明: 月を差し引くと、通常は 30 日または 31 日が差し引かれます。これにより、開始日が金曜日、土曜日、または (31 日の場合は日曜日) の場合、木曜日が追加されます。その後、トップ 4 がリストの最後の木曜日をカットします。

編集して、3 つの値を選択するだけです。

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 に答える