본문 바로가기
Database

[Oracle] 특정 시간대만 가져오는 SQL 쿼리

by 떡쇠 2023. 8. 26.
반응형

이번 주 개발 과제에서 주말을 제외하고 9시~18시만 카운트 하는 부분이 있어서 쿼리를 만들어 보았다.
 
 
1. 먼저 주말이 포함되어 있다면 금요일 18시로 변경한다. ( 주말을 제외해버리면 주말에 있는 데이터는 가져오지 못하기 때문에 먼저 토요일과 일요일을 금요일 18시로 변경하였다.)

SELECT
    CASE
        WHEN TO_CHAR(date_column, 'DY', 'NLS_DATE_LANGUAGE = ENGLISH') = 'SAT' THEN
            TRUNC(date_column) - 1 + 18/24
        WHEN TO_CHAR(date_column, 'DY', 'NLS_DATE_LANGUAGE = ENGLISH') = 'SUN' THEN
            TRUNC(date_column) - 2 + 18/24
        ELSE date_column
    END modified_date
FROM table_name
;

 
 
2. 그 다음 date_column의 시간을 가져와 9보다 작다면 9시, 18보다 크다면 18시로 변경한다. TRUNC() 함수를 사용하여   시간을 자정(00:00:00)으로 만든 후 정확히 09:00:00와 18:00:00으로 변경한다.

SELECT
    CASE
        WHEN TO_NUMBER(TO_CHAR(date_column, 'HH24')) < 9 THEN
            TRUNC(date_column) + INTERVAL '9' HOUR
        WHEN TO_NUMBER(TO_CHAR(date_column, 'HH24')) > 18 THEN
            TRUNC(date_column) + INTERVAL '18' HOUR
        ELSE date_column
    END modified_date
FROM
    my_table
;

 
 
 
3. 9시 이전이면 9시, 18시 이후면 18시로 변경하는 쿼리의 서브 쿼리로 주말을 금요일 18시로 변경하는 쿼리를 넣어 하나로 만든다.

SELECT
    CASE
        WHEN TO_NUMBER(TO_CHAR(modified_date, 'HH24')) < 9 THEN
            TRUNC(modified_date) + INTERVAL '9' HOUR
        WHEN TO_NUMBER(TO_CHAR(modified_date, 'HH24')) > 18 THEN
            TRUNC(modified_date) + INTERVAL '18' HOUR
        ELSE modified_date
    END result_date
  FROM my_table
 WHERE (SELECT
    	     CASE
                 WHEN TO_CHAR(date_column, 'DY', 'NLS_DATE_LANGUAGE = ENGLISH') = 'SAT' THEN
                     TRUNC(date_column) - 1 + 18/24
                 WHEN TO_CHAR(date_column, 'DY', 'NLS_DATE_LANGUAGE = ENGLISH') = 'SUN' THEN
                     TRUNC(date_column) - 2 + 18/24
                 ELSE date_column
              END modified_date
         FROM my_table)
;

 
 
 

반응형