DataBase/Oracle

[ORACLE] 오라클 SQL 만년 달력 만들기 - 이번달 + 날짜지정(특정일자)

이지랩(ezLab) 2022. 12. 29. 16:50
반응형

[ORACLE] 오라클 SQL 만년 달력 만들기 - 이번달 + 날짜지정(특정일자)

 

 

 

만든배경
언젠가의 일이다. 
프로그램안에서 달력을 클릭하면 달력의 모양을 보여주고 해당 달력의 일자별로 아래 내용을 넣어야 했다.
java에서 해결해도 되지만, 귀찮게 손이 많이 갈 것 같았다.
그냥 쿼리로 만들어 필요한 테이블하고 조인걸어서 그냥 뿌리고 편하게 작업하고 싶었다.
그때 만들어두었던 쿼리다.
(사실.. 별거 없음 ^^;;;;;)

 

만년 달력 쿼리 - 이번달 + 날짜지정(특정일자)
-- 만년 달력 쿼리 - 이번달 + 날짜지정(특정일자) - 오라클(Oracle) 쿼리(Query)
SELECT  MAX(DECODE(WEEK_NO, '1', DAYS, ' '))  AS "일"
      , MAX(DECODE(WEEK_NO, '2', DAYS, ' '))  AS "월"
      , MAX(DECODE(WEEK_NO, '3', DAYS, ' '))  AS "화"
      , MAX(DECODE(WEEK_NO, '4', DAYS, ' '))  AS "수"
      , MAX(DECODE(WEEK_NO, '5', DAYS, ' '))  AS "목"
      , MAX(DECODE(WEEK_NO, '6', DAYS, ' '))  AS "금"
      , MAX(DECODE(WEEK_NO, '7', DAYS, ' '))  AS "토"
  FROM  (
          SELECT  TO_NUMBER(TO_CHAR(STD_DAY + LEVEL - 1 + 1, 'IW')) AS WEEK_CNT   -- 00주차 (일요일부터 시작하도록 +1하여 계산)
                , TO_CHAR(STD_DAY + LEVEL - 1, 'D')                 AS WEEK_NO    -- 요일(숫자 - 1:일, 2:월, 3:화, 4:수, 5:목, 6:금, 7:토)
                , TO_CHAR(STD_DAY + LEVEL - 1, 'DD')                AS DAYS       -- 일자
            FROM  ( 
                    SELECT TRUNC(SYSDATE, 'MM') AS STD_DAY FROM DUAL                              -- 이번달로 계산할때
--                  SELECT TRUNC(TO_DATE('2022-01-10', 'YYYY-MM-DD'), 'MM') AS STD_DAY FROM DUAL  -- 특정일자의 월로 계산할때
                  )
          CONNECT 
              BY  STD_DAY + LEVEL - 1 <= TRUNC(LAST_DAY(STD_DAY))
        )
 GROUP 
    BY  WEEK_CNT
 ORDER 
    BY  WEEK_CNT    
;

 

쿼리결과

 

쿼리 설명
STD_DAY를 기준일로 해당월의 1일부터 말일까지 일자를 생성하고, 이때 주차수와 요일(번호)를 같이 생성한다.
이후 GROUP BY 할때 주차수로 해서, 1주~마지막주까지 행을 만들면서 각 요일별로 일자를 뿌려준다.

끝.

 

 

 

 

 

반응형