oracle 달력 만들기 질문입니다. 0 2 1,085

by 물통20병 [Oracle 기초] [2017.12.20 17:37:58]


오라클로 달력만들기를 하고 있는데

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 ('201712', 'yyyymm') base_mon
                        FROM DUAL)
          CONNECT BY base_mon + LEVEL - 1 <= LAST_DAY (base_mon))
GROUP BY week_grp
ORDER BY week_grp ;

이부분에서 굵은 부분과

 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 ( trunc(base + level -1, 'd') - trunc(base + level -1, 'y')) /7 + 1 grep,
          base + level -1 days
   from (select  to_date('201602', 'yyyymm') base
           from dual)
connect by  base + level -1 <= last_day(base))
group by grep
order by grep;

trunc(base + level -1, 'd') - trunc(base + level -1, 'y')) /7 + 1 grep,

TRUNC (base_mon + LEVEL - 1, 'd') - TRUNC (TRUNC (base_mon + LEVEL - 1, 'y'), 'd')) / 7 + 1 week_grp

결과 값이 같은데 차이점이 궁금합니다. 제가 예외를 놓치는 부분도 있는건가요?

by 마농 [2017.12.21 08:33:10]

결국 주별 구분자 역할만 하면 되는데...두가지 식이 모두 쓸데없이 복잡합니다.
복잡하기 때문에 더욱 이해하기 어려운 것입니다. 간결하게 바꿔보세요.
핵심은 주별 구분자 역할입니다. 따라서 어떤 값이 되든 주별로 같은 값만 나오면 됩니다.

SELECT MIN(DECODE(d, '1', dd)) sun
     , MIN(DECODE(d, '2', dd)) mon
     , MIN(DECODE(d, '3', dd)) tue
     , MIN(DECODE(d, '4', dd)) wed
     , MIN(DECODE(d, '5', dd)) thu
     , MIN(DECODE(d, '6', dd)) fri
     , MIN(DECODE(d, '7', dd)) sat
  FROM (SELECT TRUNC  (base + LEVEL - 1, 'd') grp
             , TO_CHAR(base + LEVEL - 1, 'd') d
             , TO_CHAR(base + LEVEL - 1, 'fmdd') dd
          FROM (SELECT TO_DATE('201602', 'yyyymm') base FROM dual)
         CONNECT BY LEVEL <= LAST_DAY(base) - base + 1
        )
 GROUP BY grp
 ORDER BY grp
;

 


by 물통20병 [2017.12.21 09:01:51]

답변 감사드립니다.

말씀하신 대로 다시 한번 공부하겠습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입