출처 :   http://bliseer.blogspot.com/2009_04_01_archive.html



특정 기간의 평일/주말을 구분하는 통계 산출 때문에 연단위의 달력이 필요했는데,,
어느 분이 이미 정리한게 있어.. 쿼리를 약간 수정해서 응용했습니다.

아래 붉은색으로 표시한 년월만 수정하면 원하는 기간으로 달력을 조회할 수 있습니다.



--2011년 01월부터 12월 기간의 달력 생성 쿼리
select dates,
         weekday,
         decode(weekday,'1','일','2','월','3','화','4','수','5','목','6','금','7','토') "weekday(요일)",
         week_cnt "week_cnt(주차)"
from (
select to_date(days,'yyyymmdd') as dates,
         to_char(to_date(days,'yyyymmdd'), 'd') as weekday,
         week_cnt
  from (select to_char(months,'yyyymm') as months,
                   to_char(months,'yyyymm') || lpad(lv, 2, '0') as days,
                   day_cnt,
                   (lv + (7-to_char(months+(lv-1), 'd')) + (to_char(to_date(to_char(months, 'yyyymm')||'01', 'yyyymmdd'), 'd')-1)) / 7 as week_cnt
           from (select add_months(to_date(201101,'yyyymm'), lv - 1) as months,
                             to_char(last_day(add_months(to_date(201101,'yyyymm'), lv-1)), 'dd') as day_cnt
                   from dual sa, 
                          (select level lv
                           from dual
                           connect by level <= months_between(to_date(201112,'yyyymm'), to_date(201101,'yyyymm'))+1)
                   ) a,
                  (select level lv
                   from dual
                   connect by level <= 31
                  ) b 
         ) m
 where months||day_cnt >= days
 order by months, days
)


Row# Dates Weekday Weekday(요일) Week_cnt(주차)

1       01/01/2011     7     토     1
2       01/02/2011     1     일     2
3       01/03/2011     2     월     2
4       01/04/2011     3     화     2
5       01/05/2011     4     수     2

 ~ 생 략 ~

359    12/25/2011     1     일     5
360    12/26/2011     2     월     5
361    12/27/2011     3     화     5
362    12/28/2011     4     수     5
363    12/29/2011     5     목     5
364    12/30/2011     6     금     5
365    12/31/2011     7     토     5






 

+ Recent posts