Oracle SQL에서 날짜를 비교할 때 아래와 같이 쓰는 경우 많은데,
WHERE JOINED BETWEEN '2021-01-01' AND '2021-12-31'
겉으로 보면 문제없어 보이지만, 특정 환경에서는 오류가 발생함.
대표적인 오류 메시지
ORA-01861: literal does not match format string
- 이유: Oracle은 문자열을 DATE로 자동 변환할 때 세션 설정(NLS_DATE_FORMAT)에 의존함
- 'YYYY-MM-DD' 형식이 기본이 아니라면 변환에 실패하고 위와 같은 오류 발생
해결책: TO_DATE로 명시적 형변환
WHERE JOINED BETWEEN TO_DATE('2021-01-01', 'YYYY-MM-DD')
AND TO_DATE('2021-12-31', 'YYYY-MM-DD')
- TO_DATE()로 포맷을 명확히 지정하면 세션 환경에 관계없이 안전하게 비교 가능
날짜 + 시간까지 고려해야 할 경우
JOINED 컬럼에 시간이 포함되어 있다면, 단순히 날짜만 비교하면 원하는 범위를 벗어날 수 있음
-- 시간 포함 시 더 정확한 필터링 가능
WHERE JOINED BETWEEN TO_DATE('2021-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
AND TO_DATE('2021-12-31 23:59:59', 'YYYY-MM-DD HH24:MI:SS')
BETWEEN은 경계값 포함
- BETWEEN A AND B는 A <= 값 <= B와 동일
- 따라서 2021-12-31 데이터도 포함됨
Oracle에서 날짜 비교를 안전하게 하려면 다음 2가지를 지켜야 함
- TO_DATE로 명시적 형변환 사용
- 필요한 경우 시간까지 포함해서 비교
'DB > Oracle - SQL' 카테고리의 다른 글
| Oracle SQL | Oracle Join vs ANSI Join 차이와 정리 (0) | 2025.05.08 |
|---|---|
| Oracle SQL | TO_DATE로 날짜 왜곡되는 이유와 해결법 (0) | 2025.05.08 |
| Oracle SQL | WHERE 절에 조건 여러 개 쓰는 법 (AND, OR, BETWEEN, 괄호까지) (1) | 2025.05.06 |
| Oracle SQL | NVL / NVL2 / DECODE 함수로 NULL을 다루는 방법 (0) | 2025.05.06 |
| Oracle SQL | SQL 실행 순서 (0) | 2025.05.06 |