Etc

[Oracle SQL] 날짜 데이터 필터링하는 4가지 방법

weweGH 2024. 12. 2. 15:29
반응형

Oracle SQL 날짜 데이터 필터링
Oracle SQL 날짜 데이터 필터링


[Oracle SQL] 날짜 데이터 필터링하는 4가지 방법


들어가며


데이터베이스에서 날짜 데이터를 기준으로 필터링할 때, 쿼리문을 효율적으로 작성하지 않으면 조회 시간이 매우 늘어납니다. 이 글에서는 Oracle SQL로 날짜 데이터를 필터링하는 4가지 방법을 소개합니다.

이 글에서 활용할 예제 데이터는 다음과 같이 OCR_TM이라는 DATE 형식이 포함된 데이터입니다. OCR_TM을 기준으로 1일 치 데이터를 필터링하는 4가지 방법을 소개합니다.

예제 데이터
예제 데이터


  • SOL 1 - TRUNC, TO_DATE
  • SOL 2 - TO_CHAR
  • SOL 3 - BETWEEN, TO_DATE
  • SOL 4 - 부등호, TO_DATE

SOL 1 - TRUNC, TO_DATE


첫 번째 방법은 TRUNC와 TO_DATE를 활용하는 방법입니다. OCR_TM은 연월일 시분초까지 표현된 컬럼이므로 YYYY-MM-DD와 같은 형식에 맞춰 절삭 후 필터링하는 방법입니다. 하지만, OCN_TM 컬럼의 모든 값을 TRUNC 함수로 변환하여 비교하므로 인덱스를 사용할 수 없어 성능 저하를 초래할 수 있습니다.

SELECT *
FROM TEST_DB
WHERE TRUNC(OCR_TM) = TO_DATE('2020-08-11', 'YYYY-MM-DD')
;

SOL 2 - TO_CHAR


두 번째 방법은 타입을 문자 형태로 변환하여 필터링하는 방법입니다. TO_CHAR를 활용하여 문자 형태로 변환 후 조회합니다. 이 방법 또한, OCN_TM 컬럼의 값을 문자형으로 변환하여 비교하므로 인덱스 활용이 불가능합니다.

SELECT *
FROM TEST_DB
WHERE TO_CHAR(OCR_TM, 'YYYYMMDD') = '20200811'
;

SOL 3 - BETWEEN, TO_DATE


세 번째 방법은 BETWEEN과 TO_DATE를 활용하는 방법입니다. 필터링하고자 하는 날짜의 00시 00분 00초부터 23시 59분 59초에 맞춰 BETWEEN을 활용하여 필터링 후 조회합니다. OCN 컬럼의 범위를 지정하기 때문에 인덱스 활용은 가능하지만 끝나는 시간이 23:59:59 이후 ms 단위의 데이터가 존재한다면 포함하지 못할 수 있으므로 주의가 필요합니다.

SELECT *
FROM TEST_DB
WHERE OCR_TM BETWEEN TO_DATE('2020-08-11 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
    AND TO_DATE('2020-08-11 23:59:59', 'YYYY-MM-DD HH24:MI:SS')
;

SOL 4 - 부등호, TO_DATE


네 번째 방법은 부등호와 TO_DATE를 활용하는 방법입니다. 조회하고자 하는 날짜인 D-DAY와 D+1을 부등호로 표현하여 필터링 후 조회합니다. 이 방법은 시작 시간과 끝 시간을 명확하게 지정하여 범위를 설정하므로 인덱스 활용도 가능할 뿐만 아니라 누락되는 데이터 없이 조회가 가능합니다.

SELECT *
FROM TEST_DB
WHERE OCR_TM >= TO_DATE('2020-08-11', 'YYYY-MM-DD')
  AND OCR_TM < TO_DATE('2020-08-12', 'YYYY-MM-DD')
;

위 네 가지 쿼리 중 가장 추천하는 방법은 SOL 3 또는 SOL 4입니다. 데이터베이스의 옵티마이저를 통해 계산한 COST 결과, 크게 차이는 없지만 SOL 3과 SOL 4가 가장 낮은 COST가 산출된 것을 확인할 수 있습니다.

쿼리 COST
SOL 1 184,822
SOL 2 184,645
SOL 3 184,292
SOL 4 184,292

반응형