2012. 4. 6. 10:31

오라클 달력 생성 쿼리


SELECT

--달력 맵핑

        MIN(DECODE(TO_CHAR(DATES,'D'),1,TO_CHAR(DATES,'DD'))) 일

        ,MIN(DECODE(TO_CHAR(DATES,'D'),2,TO_CHAR(DATES,'DD'))) 월

        ,MIN(DECODE(TO_CHAR(DATES,'D'),3,TO_CHAR(DATES,'DD'))) 화

        ,MIN(DECODE(TO_CHAR(DATES,'D'),4,TO_CHAR(DATES,'DD'))) 수

        ,MIN(DECODE(TO_CHAR(DATES,'D'),5,TO_CHAR(DATES,'DD'))) 목

        ,MIN(DECODE(TO_CHAR(DATES,'D'),6,TO_CHAR(DATES,'DD'))) 금

        ,MIN(DECODE(TO_CHAR(DATES,'D'),7,TO_CHAR(DATES,'DD'))) 토

FROM(

    SELECT (MAKE_DATES + LEVEL - 1) DATES   --달력 하위 일수 구하기

    FROM(

        SELECT (TO_DATE('200701','YYYYMM')) MAKE_DATES FROM DUAL --기준달력 생성

    )

    CONNECT BY (MAKE_DATES+LEVEL-1) <= LAST_DAY(MAKE_DATES) --마지막일자

)

GROUP BY DECODE(TO_CHAR(DATES,'D'),1, TO_CHAR(DATES,'W')+1,TO_CHAR(DATES,'W')) --합치기

ORDER BY DECODE(TO_CHAR(DATES,'D'),1, TO_CHAR(DATES,'W')+1,TO_CHAR(DATES,'W')); --주차 정렬