상세 컨텐츠

본문 제목

오라클 연단위 달력 쿼리

DataBase/Oracle

by 탑~! 2012. 8. 23. 14:35

본문

출처 : 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






관련글 더보기