2012-05-25 4 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 

내가 얻을 출력은 2012년 5월 10일, 2012년 5월 17일, 2012년 5월 24일입니다.

하지만 2012년 5월 18일에 날짜를 변경할 때 내가 얻을 출력은

2012년 4월 26일, 2012년 5월 3일, 2012년 5월 10일

이다 그러나 그것이 있어야 05/3, 05/10, 05/17 ..... 무엇이 잘못 되었습니까? 아니면 다른 방법이 있습니까?

+0

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

답변

3

그냥 DATEADD(Week, -4,DATEADD(Month, -1,을 교체하고는 금요일과 토요일 근무를 시작합니다.

설명 : 시작 날짜는 금요일, 토요일 또는 (31 일 경우 일요일) 경우 추가 목요일을 추가 그것은 일반적으로 30 삼십일일 substracts 한 달, 빼기합니다. 그 후 상위 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 
+0

덕분 톤은 작동 ... 난 이제 네 개의 값을 받고 난 그냥이 작업을 수행하는 솔루션을 추가 @karthi 첫 번째 레코드 – Karthik

+0

를 무시하고 세 가지를 고려하고 현재의 ?? 직접 세 날짜를 얻을 수 있습니다. 달리 목요일을 입력하면 너무 많은 것을 하나 받기 때문에 -1 일이 필요합니다. –

+0

도움 주셔서 감사합니다. :-) – Karthik

관련 문제