//달력만들기
1. 행을 인위적으로 만들기
connect by level
2. 그룹함수
여러행을 하나의 행으로 만드는것 decode
3. expression
테이블에 존재하지 않지만 수식, 함수를 이용하여 새로운 컬럼을 만드는 방법
4. 부수적인 것들
date 관련 함수들
-월의 마지막일자 구하기
PROCESS
1.dual table
인위적으로 여러개의 행을 만들기
SELECT LEVEL, dummy , SYS_CONNECT_BY_PATH(dummy ,'-')
FROM dual
CONNECT BY LEVEL <= 10 ;
CONNECT BY 는 계층쿼리 . 행을 연결하는 방법
계층쿼리 : 행과 행을 연결함
CONNECT BY LEVEL ==> CROSS JOIN 과 비슷
조인 : 테이블의 행과, 다른 테이블의 행을 연결 - 컬럼이확장
1)SELECT LEVEL, dummy , LTRIM(SYS_CONNECT_BY_PATH(dummy ,'-') , '-')
FROM dual
CONNECT BY LEVEL <= 31 ;
2) 년월 문자열이 주어졌을 때 해당 월의 일 수 구하기
EX : '202010' = > 31
날짜가 있으면 원하는 항목 ( 년, 월, 일, 시, 분, 초 ) 만 추출 할 수 있다.
TO_CHAR(날짜, '원하는항목' )
-TO_DATE ('202010' , 'YYYYMM' ) : 일자를 설정하지 않았기 때문에 1일자 0시 0분 0초 => 마지막 날짜로
변경
-
SELECT TO_CHAR( LAST_DAY(TO_DATE ('202010' , 'YYYYMM' )) , 'DD' )
FROM dual ;
SELECT LEVEL, dummy
FROM dual
CONNECT BY LEVEL <= TO_CHAR( LAST_DAY(TO_DATE ('202010' , 'YYYYMM' )) , 'DD' )
실제 필요한 값 : 날짜 ( 20201001 ~ 20201031)
개념 : DATE + 정수 : DATE 에서 정수를 일자를 취급해서 더한 날짜가 나옴
2020.10.05 + 5 = 2020.10.10
- 2020년 10월 1일자를 만들려면
주어진것 : '202010'
'202010' || '01' ==> '20201001'
TO_DATE('202010' || '01' , 'YYYYMMDD')
동일 : TO_DATE('202010' , 'YYYYMM' )
2020 년 10월 1일의 날짜 타입을 구함 .
날짜 + 숫자 (LEVEL) 연산을 통해 2020년 10월의 모든 일자를 구할 수 있다.
level 은 1부터 시작하므로 2020년 10월 1일값을 유지하기 위해서는 날짜 + LEVEL -1
기본이 만들어 졌다.
SELECT TO_DATE('202010' , 'YYYYMM' ) + LEVEL - 1 DAY,
TO_CHAR( TO_DATE('202010' , 'YYYYMM' ) + LEVEL - 1 , 'D') D,
TO_CHAR( TO_DATE('202010' , 'YYYYMM' ) + LEVEL - 1 , 'iw') iw
FROM dual
CONNECT BY level <= TO_CHAR(LAST_DAY(TO_DATE('202010' , 'YYYYMM' )) , 'DD')
다음 :
SELECT day, d, iw , DECODE( d , 1 , day ) sun , DECODE( d, 2, day ) mon ,
DECODE( d, 3, day ) tue , DECODE ( d, 4, day ) wed , DECODE ( d, 5, day ) tues,
DECODE ( d, 6, day ) fri , DECODE ( d, 7, day ) sat
FROM
(SELECT TO_DATE('202010' , 'YYYYMM' ) + LEVEL - 1 day,
TO_CHAR( TO_DATE('202010' , 'YYYYMM' ) + LEVEL - 1 , 'D') d,
TO_CHAR( TO_DATE('202010' , 'YYYYMM' ) + LEVEL - 1 , 'iw') iw
FROM dual
CONNECT BY level <= TO_CHAR(LAST_DAY(TO_DATE('202010' , 'YYYYMM' )) , 'DD')
)
해당 날짜의 요일에 따라서 새롭게 만든 7개 컬럼 ( 일 ~ 월 ) 에 날짜를 위치 시킨다.
SELECT DECODE(d, 1, iw+1 , iw), MIN(DECODE( d , 1 , day )) sun , MIN(DECODE( d, 2, day )) mon ,
MIN(DECODE( d, 3, day )) tue , MIN(DECODE ( d, 4, day )) wed , MIN(DECODE ( d, 5, day )) tues,
MIN(DECODE ( d, 6, day )) fri , MIN(DECODE ( d, 7, day )) sat
FROM
(SELECT TO_DATE('202010' , 'YYYYMM' ) + LEVEL - 1 day,
TO_CHAR( TO_DATE('202010' , 'YYYYMM' ) + LEVEL - 1 , 'D') d,
TO_CHAR( TO_DATE('202010' , 'YYYYMM' ) + LEVEL - 1 , 'iw') iw
FROM dual
CONNECT BY level <= TO_CHAR(LAST_DAY(TO_DATE('202010' , 'YYYYMM' )) , 'DD')
)
GROUP BY DECODE(d, 1, iw+1 , iw)
ORDER BY DECODE(d, 1, iw+1 , iw);
응용
nvl을 사용해서 null 을 없앨 수 있다.
주의 일요일로 iw 대신하면 12월의 주차를 해결할 수 있따.
댓글
댓글 쓰기