반응형

년도와 월이 주어졌을 경우, 해당 월의 달력을 생성해주는 쿼리를 만들어 보자.
쿼리는 아래와 같다. (2000년 01월이 주어졌을 경우)


SELECT   MIN (DECODE (TO_CHAR (days, 'd'), 1, TO_CHAR (days, 'fmdd'))) 일,
         MIN (DECODE (TO_CHAR (days, 'd'), 2, TO_CHAR (days, 'fmdd'))) 월,
         MIN (DECODE (TO_CHAR (days, 'd'), 3, TO_CHAR (days, 'fmdd'))) 화,
         MIN (DECODE (TO_CHAR (days, 'd'), 4, TO_CHAR (days, 'fmdd'))) 수,
         MIN (DECODE (TO_CHAR (days, 'd'), 5, TO_CHAR (days, 'fmdd'))) 목,
         MIN (DECODE (TO_CHAR (days, 'd'), 6, TO_CHAR (days, 'fmdd'))) 금,
         MIN (DECODE (TO_CHAR (days, 'd'), 7, TO_CHAR (days, 'fmdd'))) 토
    FROM (SELECT     base_mon + LEVEL - 1 days,
                         (  TRUNC (base_mon + LEVEL - 1, 'd')
                          - TRUNC (TRUNC (base_mon + LEVEL - 1, 'y'), 'd')
                         ) / 7 + 1 week_grp
                FROM (SELECT TO_DATE ('200001', 'yyyymm') base_mon
                        FROM DUAL)
          CONNECT BY base_mon + LEVEL - 1 <= LAST_DAY (base_mon))
GROUP BY week_grp
ORDER BY week_grp 



connect by level 절을 사용하지 못하는 버전일 경우에는, 아래와 같이 dict 테이블을 이용한다.
아래 예는 위의 쿼리 와는 다르게 오늘로부터 몇달 후인지를 나타내는 변수 :n에 따라 달력을 생성한다.
(:n=-1 일 경우 지난달, 0은 이번달, 1은 다음달, 2는 다다음달,...)


SELECT   MIN (DECODE (TO_CHAR (days, 'd'), 1, TO_CHAR (days, 'fmdd'))) 일,
         MIN (DECODE (TO_CHAR (days, 'd'), 2, TO_CHAR (days, 'fmdd'))) 월,
         MIN (DECODE (TO_CHAR (days, 'd'), 3, TO_CHAR (days, 'fmdd'))) 화,
         MIN (DECODE (TO_CHAR (days, 'd'), 4, TO_CHAR (days, 'fmdd'))) 수,
         MIN (DECODE (TO_CHAR (days, 'd'), 5, TO_CHAR (days, 'fmdd'))) 목,
         MIN (DECODE (TO_CHAR (days, 'd'), 6, TO_CHAR (days, 'fmdd'))) 금,
         MIN (DECODE (TO_CHAR (days, 'd'), 7, TO_CHAR (days, 'fmdd'))) 토
    FROM (SELECT base_mon + ROWNUM - 1 days,
                     (  TRUNC (base_mon + ROWNUM - 1, 'd')
                      - TRUNC (TRUNC (base_mon + ROWNUM - 1, 'y'), 'd')
                     )
                   / 7
                 + 1 week_grp
            FROM (SELECT TRUNC (ADD_MONTHS (SYSDATE, :n), 'mm') base_mon
                    FROM DUAL), dict
           WHERE base_mon + ROWNUM - 1 <= LAST_DAY (base_mon))
GROUP BY week_grp
ORDER BY week_grp

반응형

'데이터베이스 > Oracle' 카테고리의 다른 글

Orange for Oracle 단축키  (0) 2019.01.28
[oracle]GREATEST, LEAST 함수  (0) 2018.06.22
[오라클]그룹별 순번 만들기  (0) 2013.06.21
[오라클]유저생성  (0) 2013.04.09
행을 열로 표시하기  (0) 2011.10.14

+ Recent posts