반응형
이번 주 개발 과제에서 주말을 제외하고 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)
;
반응형
'Database' 카테고리의 다른 글
[Oracle] Partition By 절을 활용한 데이터 그룹화 및 분석 (0) | 2024.06.23 |
---|---|
날짜 파티션 인덱스 최적화: TRUNC와 형변환을 피하는 방법 (0) | 2024.05.19 |
[Oracle] 조인(Join) 알고리즘 (0) | 2024.05.04 |
[Oracle] SQL 쿼리에 대한 옵티마이저 힌트를 제공하는 문법 (0) | 2024.05.04 |
서브쿼리의 종류: 인라인 뷰와 스칼라 쿼리의 이해 (0) | 2024.05.04 |