오라클로 달력만들기를 하고 있는데
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
결과 값이 같은데 차이점이 궁금합니다. 제가 예외를 놓치는 부분도 있는건가요?
결국 주별 구분자 역할만 하면 되는데...두가지 식이 모두 쓸데없이 복잡합니다.
복잡하기 때문에 더욱 이해하기 어려운 것입니다. 간결하게 바꿔보세요.
핵심은 주별 구분자 역할입니다. 따라서 어떤 값이 되든 주별로 같은 값만 나오면 됩니다.
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 ;