-
[ORACLE] CONNECT BY LEVEL 활용 <달력>DATABASE 2018. 11. 5. 13:16
- 현재 달의 달력 표현
SELECT
max(decode(to_char(sday+cnt-1,'d'),1,A.cnt)) 일,
max(decode(to_char(sday+cnt-1,'d'),2,A.cnt)) 월,
max(decode(to_char(sday+cnt-1,'d'),3,A.cnt)) 화,
max(decode(to_char(sday+cnt-1,'d'),4,A.cnt)) 수,
max(decode(to_char(sday+cnt-1,'d'),5,A.cnt)) 목,
max(decode(to_char(sday+cnt-1,'d'),6,A.cnt)) 금,
max(decode(to_char(sday+cnt-1,'d'),7,A.cnt)) 토
FROM (select level cnt,
trunc(to_date(SYSDATE),'mm') sday
from dual
connect by level<=LAST_DAY(to_date(SYSDATE))-trunc(to_date(SYSDATE),'mm')+1) A
group by trunc(sday+cnt-1,'d')
order by 7;
** to_char(sday+cnt-1,'d')
주중의 일을 1~7로 표시 (일요일 : 1 ~ 토요일 : 7 )
** LAST_DAY(to_date(SYSDATE))
현재날의 마지막 날 반환
** trunc(to_date(SYSDATE),'mm')
YYYY년 MM월 01일
** trunc(sday+cnt-1,'d')
가장최근에 지난 요일로 반환
** order by 7
7번째 컬럼 기준(토요일 컬럼)으로 정렬 ( 디폴트: 오름차순 ASC)
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('20181101','YYYYMMDD') 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, 'IW')+1, TO_CHAR(DATES, 'IW'))
ORDER BY DECODE(TO_CHAR(DATES,'D'), 1, TO_CHAR(DATES, 'IW')+1, TO_CHAR(DATES, 'IW'))
'DATABASE' 카테고리의 다른 글
[ORACLE] MERGE문 (0) 2018.11.06 [ORACLE] ROW_NUMBER() OVER( ) (0) 2018.11.05 [ORACLE] CONNECT BY LEVEL 개념 (0) 2018.11.05 [ORACLE] DECODE 와 CASE (0) 2018.11.05 [ORACLE] 함수 모음 (0) 2018.11.05