2013. 3. 13. 21:55

월에 두번째/세번째 요일 구하기.


업무를 하다보면  월 두번째, 세번째 특정 요일을 구해야 하는 경우가 있다. 

여기서는 금요일로 하겠다. 


declare @dt_getdate date

set @dt_getdate = '2013-03-13'

select @dt_getdate

 

select DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,6-datepart(day,@dt_getdate),@dt_getdate) ), 4)


위 쿼리는 해당 월의 첫번째 금요일을 알려준다, 

허나 2013년 3월의 경우  3/1일이 금요일 이긴 하지만 주로 처리 되면 2월의 마지막 주가 되서 3/1일이 아닌 

3/8일이 결과가 나온다. 


이럴 경우, 두번째 금요일, 세번째 금요일도 원하는 결과가 아니다. 



그래서 , 구하려고 하는 달의 다음날 첫 일의 금요일을 찾아 거꾸로 찾는 방법을 택했다. 


-- 다음달의 첫번째 날짜를 구하자.

declare @dt_getdate date , @dt_next_month_day date

set @dt_getdate = '2013-02-13'

--set @dt_getdate = dateadd(mm,1,@dt_getdate)

select @dt_getdate

 

set @dt_next_month_day = CONVERT(VARCHAR(10),DATEADD(dd,-(DAY(DATEADD(mm,1,@dt_getdate))-1),DATEADD(mm,1,@dt_getdate)),121)

select @dt_next_month_day

if Datepart(dw, @dt_next_month_day )= 6

   select dateadd(dd,-21,@dt_next_month_day) as '둘째 ', dateadd(dd,-14, @dt_next_month_day) as '셋째 '

else

   select dateadd(dd,-21,dateadd(dd, 6- datepart(dw,@dt_next_month_day ), @dt_next_month_day) ) as '둘째 ',

               dateadd(dd,-14,dateadd(dd, 6- datepart(dw,@dt_next_month_day ), @dt_next_month_day) ) as '셋째 '