현재 일자가 속한 분기 구하는 쿼리

2023. 12. 2. 00:38DB/oracle

 

2022년 2023년
12월 1 월 2 월 3 월 4 월 5 월 6 월 7 월 8 월 9 월 10 월 11 월
1분기 2분기 3분기 4분기

 

지난해 12월을 시작으로 3개월씩 분기를 나누었을 때 특정일자를 기준으로 현재 출력할 수 있는 분기수가 몇 개인지 구하려면 어떻게 해야 할까?

 

가령 현재 일자가 2023년 11월 29일일 때의 분기를 구하면 4분기가 아니고 3분기가 되어야 한다. 왜냐하면 11월 말일이 30일인데 아직 말일이 안지났기 때문에 분기별 데이터가 계속 쌓일 수 있어서 바로 전 분기인 3분기가 되어야 한다.

 

/* 날짜 판별을 위한 분기 기준 데이터 생성
   - agoYr : 지난 해
   - basYr : 기준년도
*/
SELECT #{agoYr} || '1201' AS FRST_DT, TO_CHAR(LAST_DAY(TO_DATE(#{basYr} || '02', 'YYYYMM)), 'YYYYMMDD') AS LAST_DT, 1 AS DIV_TERM FROM DUAL
UNION
SELECT #{basYr} || '0301' AS FRST_DT, TO_CHAR(LAST_DAY(TO_DATE(#{basYr} || '05', 'YYYYMM)), 'YYYYMMDD') AS LAST_DT, 2 AS DIV_TERM FROM DUAL
UNION
SELECT #{basYr} || '0601' AS FRST_DT, TO_CHAR(LAST_DAY(TO_DATE(#{basYr} || '08', 'YYYYMM)), 'YYYYMMDD') AS LAST_DT, 3 AS DIV_TERM FROM DUAL
UNION
SELECT #{basYr} || '0901' AS FRST_DT, TO_CHAR(LAST_DAY(TO_DATE(#{basYr} || '11', 'YYYYMM)), 'YYYYMMDD') AS LAST_DT, 4 AS DIV_TERM FROM DUAL

 

현재 일자가 몇 번째 분기에 속하는지 검사하기 위한 데이터

 

위 레코드들을 기준으로, 현재 날짜가 2023년 11월 29일일 때, 1, 2, 3 분기를 모두 출력할 수 있다. 4분기는 아직 해당 월이 끝난 게 아니므로 배제함. 이것을 쿼리로 작성하면 다음과 같다.

 

WITH DIV_SCOPE AS (
  SELECT #{agoYr} || '1201' AS FRST_DT, TO_CHAR(LAST_DAY(TO_DATE(#{basYr} || '02', 'YYYYMM)), 'YYYYMMDD') AS LAST_DT, 1 AS DIV_NO FROM DUAL
  UNION
  SELECT #{basYr} || '0301' AS FRST_DT, TO_CHAR(LAST_DAY(TO_DATE(#{basYr} || '05', 'YYYYMM)), 'YYYYMMDD') AS LAST_DT, 2 AS DIV_NO FROM DUAL
  UNION
  SELECT #{basYr} || '0601' AS FRST_DT, TO_CHAR(LAST_DAY(TO_DATE(#{basYr} || '08', 'YYYYMM)), 'YYYYMMDD') AS LAST_DT, 3 AS DIV_NO FROM DUAL
  UNION
  SELECT #{basYr} || '0901' AS FRST_DT, TO_CHAR(LAST_DAY(TO_DATE(#{basYr} || '11', 'YYYYMM)), 'YYYYMMDD') AS LAST_DT, 4 AS DIV_NO FROM DUAL
)
SELECT *
  FROM DIV_SCOPE
 WHERE DIV_NO = (
           SELECT MAX(DIV_NO)
             FROM DIV_SCOPE
            WHERE '20231129' >= FRST_DT
              AND '20231129' >= LAST_DT

--            WHERE TO_CHAR(SYSDATE, 'YYYYMMDD') >= FRST_DT
--              AND TO_CHAR(SYSDATE, 'YYYYMMDD') >= LAST_DT)

 

1, 2, 3 분기 모두 20231129 보다 이전이며 그 중에서 가장 가까운 분기가 3 분기이다.

 

'DB > oracle' 카테고리의 다른 글

[SQL] - ORDER BY  (0) 2023.11.20