[Oracle] 오라클에서 날짜를 비교하는 방법

오라클에서 날짜를 비교할 때 주의사항이 있습니다. DATE형/ 문자형끼리 비교는 문제가 없지만 DATE형과 문자형의 비교일 경우 서로 데이터 타입을 맞춰줘야 합니다. 오라클에서 주로 날짜 포맷을 맞추는 TO_CHAR 함수의 리턴 값이 문자형이므로 이런 실수가 자주 나옵니다.

 

날짜 비교

WITH EXAMPLE AS(
SELECT 
TO_CHAR(SYSDATE,'YY/MM/DD') AS DAY1, --19/12/01'
SYSDATE AS DAY2 --19/12/01'
FROM DUAL
)

SELECT
'두 날짜는 서로 같습니다.'
FROM
EXAMPLE
WHERE
DAY1 = DAY2

위 쿼리를 조회해보면 데이터가 조회되지 않습니다. 데이터가 조회되지 않은 이유는 바로 서로의 데이터 타입이 다르기 때문입니다. SYSDATE의 경우 포맷을 정해주지 않았으므로 기본 포맷인 DATE 타입으로 데이터가 출력됩니다. 하지만 DAY1의 경우 'YYMMDD' 포맷으로 변환을 했기에 CHAR 타입으로 데이터가 출력될 것입니다. 그렇기에 같은 날짜임에도 불구하고 데이터가 서로 같지 않다고 인식을 하게 된 것입니다.

 

날짜를 비교할때는 문자형으로 치환하여 비교하는것이 좋습니다.

날짜를 비교할 때는 TO_DATE를 활용하여 DATE 타입으로 맞추기보다는 TO_CHAR을 활용하여 문자형 타입으로 바꾸는 것이 좋습니다. DATE 타입일 경우 날짜뿐만 아니라 시간 단위까지 데이터가 들어갈 수가 있는데 문자형에서 날짜형으로 치환할 경우, 이 정보들은 누락될 수 있기 때문입니다.

 

문자형으로 치환 후 날짜 비교

WITH EXAMPLE AS(
SELECT 
TO_CHAR(SYSDATE,'YY/MM/DD') AS DAY1, --19/12/01'
SYSDATE AS DAY2 --19/12/01'
FROM DUAL
)

SELECT
'두 날짜는 서로 같습니다.'
FROM
EXAMPLE
WHERE
DAY1 = TO_CHAR(DAY2)

날짜비교

위 쿼리 문의같이 WHERE절에 비교할 데이터를 TO_CHAR로 DAY2 문자형으로 변환해서 출력하면 데이터가 정상적으로 출력됩니다. 여기서 또 한 가지 주의할 점은 두 개의 비교할 데이터의 포맷을 맞춰주어야 합니다. 위와 같은 경우에는 19/12/01 = 19/12/01로 비교되어 데이터가 출력이 될 것이지만 예를 들어 TO_CHAR(SYSDATE,'YYYY/MM/DD') AS DAY1로 포맷을 지정하였을 경우 2019/12/01 = 19/12/01로 비교되어 데이터가 출력되지 않습니다.

 

묵시적 형변환

가끔 데이터 타입을 맞춰주지 않아도 에러가 나지 않는 경우가 있습니다. DATE 타입과 문자 타입이 서로 비교할 수 있는 것이 아니라 오라클 내부에서 자동으로 형 변환을 해준 것입니다. 이것을 묵시적 형 변환이라고 말합니다. 하지만 이런 묵시적 형 변환 시스템을 믿고 형 변환을 꼼꼼하게 해주지 않으면 언제든지 오류가 생길 수 있습니다. 형 변환을 하지 않아도 잘 동작하는 소스라도 데이터 타입이 다르다면 꼭 꼼꼼하게 형 변환을 해주는 습관을 들여야 합니다.

댓글

Designed by JB FACTORY