본문 바로가기
Data Engineering/SQL

[ORACLE] 계층형 쿼리를 활용한 날짜 생성 (CONNECT BY LEVEL 이용)

by jangThang 2023. 12. 5.
반응형

 계층형 쿼리는 흔히 직위나 조직과 같이 계층형 구조를 가진 데이터를 조회할 때 사용합니다. 하지만 계층형 쿼리는 일련의 날짜를 생성하는 데에도 자주 활용됩니다. 이를 날짜 생성에 활용하는 방법을 알아봅니다.

 

[ Contents ]

     

     

    1. CONNECT BY LEVEL

    CONNECT BY 조건문

     

     CONNECT BY LEVEL를 잘 이용하면, 반복문 FOR문처럼 순회하며 조회할 수 있습니다.

     LEVEL이 FOR문의 i 변수라고 생각하시면 되며, 1부터 시작해서 2, 3, 4와 같이 +1씩 오릅니다.

     

     

    SELECT LEVEL, LEVEL*2, LEVEL*LEVEL FROM DUAL
    CONNECT BY LEVEL <= 5;

     실제로 위 쿼리를 실행하면 LEVEL이 5가 될 때까지, 5번 순회합니다.

     

     

    for(int i=1; i<=5; i++){
    	printf("%d %d %d \n", i, 2*i, i*i);
    }

     이런 for문이라고 생각하시면 쉽게 이해가 되실 듯합니다.

     

     

     

    2. 일련의 날짜 생성

    SELECT
        '202312' || LPAD(LEVEL, 2, '0') AS DT
    FROM DUAL
    CONNECT BY LEVEL <= 31;

     

     2023년 12월 날짜도 이런 식으로 쉽게 생성할 수 있습니다. 1부터 31까지 반복하며 날짜를 생성합니다.

     

     

    SELECT
        SUBSTR('20231204', 0, 6) || LPAD(LEVEL, 2, '0') AS DT
    FROM DUAL
    CONNECT BY LEVEL <= TO_CHAR(LAST_DAY('20231204'), 'DD')

     특정 날짜에 구애받지 않도록 설계하려면 이런 식으로 하면 되겠죠.

     위 SQL은 입력받은 날짜가 속한 달을 출력하는 쿼리입니다.

     

     

     

    반응형

     

    3. CONNECT BY 활용

    1) 두 날짜 사이의 일자 생성

    SELECT
        TO_DATE('20231205', 'YYYYMMDD') + LEVEL - 1
    FROM DUAL
    CONNECT BY LEVEL <= TO_DATE('20231210', 'YYYYMMDD') - TO_DATE('20231205', 'YYYYMMDD') + 1

     2023년 12월 05일부터 2023년 12월 10일까지의 날짜 생성하는 쿼리입니다.

     

     두 날짜의 차이만큼 LEVEL이 순회하며, 시작일에 LEVEL을 더해가며 일자를 생성합니다.

     

     

     

    2) 두 날짜 사이의 주말 생성

    SELECT TO_DATE('20231201', 'YYYYMMDD') + LEVEL - 1 AS "주말"
        , TO_CHAR(TO_DATE('20231201', 'YYYYMMDD') + LEVEL - 1, 'DY') AS "요일"
    FROM DUAL
    WHERE TO_CHAR(TO_DATE('20231201', 'YYYY-MM-DD') + LEVEL - 1, 'D') IN (7, 1)
    CONNECT BY LEVEL <= (TO_DATE('20231231', 'YYYYMMDD') - TO_DATE('20231201', 'YYYYMMDD') + 1)

     특정 기간 동안의 특정 요일만 생성할 수도 있습니다. 위 SQL은 2023년 12월 간 주말만 생성하는 쿼리입니다.

     

     

     

    star가 되고나서 Tistory

    반응형

    댓글