IT/DataBase

[Oracle] 달력 만들기

알 수 없는 사용자 2023. 4. 1.
반응형
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으로 요일에 해당되는 숫자로 분기 처리해서

월~일까지로 설정한다.

 

개인 공부 내용을 올리는 공간이므로 틀린 내용이 있을 수 있으니 이 경우 댓글 부탁 드립니다.

반응형

댓글

💲 추천 글