반응형
WITH first_day AS (
SELECT TRUNC(SYSDATE,'MM') AS first_day
FROM dual
),cal AS (
SELECT TO_CHAR(first_day + LEVEL -1,'D') 요일_숫자
, TO_CHAR(first_day + LEVEL -1,'MM-DD') 월일
, TO_CHAR(first_day + LEVEL -1,'IW') 주차
FROM first_day
CONNECT BY first_day + LEVEL -1 <= LAST_DAY(SYSDATE)
)
SELECT COUNT(*) OVER(ORDER BY cal.주차) 주차 -- 옵션
, min(DECODE(cal.요일_숫자,2,cal.월일)) 월요일
, min(DECODE(cal.요일_숫자,3,cal.월일)) 화요일
, min(DECODE(cal.요일_숫자,4,cal.월일)) 수요일
, min(DECODE(cal.요일_숫자,5,cal.월일)) 목요일
, min(DECODE(cal.요일_숫자,6,cal.월일)) 금요일
, min(DECODE(cal.요일_숫자,7,cal.월일)) 토요일
, min(DECODE(cal.요일_숫자,1,cal.월일)) 일요일
FROM cal
GROUP BY cal.주차
;
달력 만들 때 필요한 데이터
한주의 요일을 숫자로 나타낸 데이터(일요일(1) ~ 토요일(7))
SELECT TO_CHAR(SYSDATE,'D') FROM dual;
달력에 표시할 월일
SELECT TO_CHAR(SYSDATE,'MM-DD') FROM dual;
GROUP BY 하기 위한 주차(해당 일이 몇주에 해당하는지)
SELECT TO_CHAR(SYSDATE,'IW') FROM dual;
최소 위 3가지 데이터가 있으면 달력을 만들 수 있다.
먼저 시작일을 구한 뒤 LAST_DAY로 월의 제일 마지막 날까지 반복한 다음
요일을 숫자로 나타낸 데이터, 월일, 주차를 조회한다.
그 후 주차로 GROUP BY를 해서 OVER(ORDER BY 주차)를 해서 1~5까지로 정렬한다.
그 후 MIN()으로 월일의 최소값을 뽑되 CASE WHEN으로 요일에 해당되는 숫자로 분기 처리해서
월~일까지로 설정한다.
개인 공부 내용을 올리는 공간이므로 틀린 내용이 있을 수 있으니 이 경우 댓글 부탁 드립니다.
반응형
'IT > DataBase' 카테고리의 다른 글
[Oracle] 해당월말일 ~ 익월 말일까지 조회 (0) | 2023.05.30 |
---|---|
[Oracle] 재귀 복사 (0) | 2023.05.07 |
[SQL] update에서 case when절 사용 (0) | 2023.03.04 |
[Oracle]ORACLE 계층형 쿼리 (0) | 2022.11.29 |
[Oracle]ORACLE 12C SQL에 추가된 새로운 기능 (0) | 2022.11.29 |
댓글