728x90

Oracle SQL을 다루는 과정에서 자주 마주치는 오류 중 하나가 바로 ORA-01843: not a valid month입니다. 날짜 관련 연산이나 INSERT, UPDATE 작업에서 이 오류가 발생하면 대부분 날짜 형식이 Oracle이 기대하는 포맷과 일치하지 않기 때문입니다.
1. ORA-01843 오류란?
ORA-01843: not a valid month
이 오류는 Oracle이 문자열을 DATE 타입으로 변환할 때, 해당 문자열의 월(Month) 값이 올바르지 않다고 판단하는 경우 발생합니다. 주로 TO_DATE 함수나 DATE 컬럼에 문자열을 직접 대입할 때 발생합니다.
2. 대표적인 오류 예시와 해결 방안
| 오류 SQL 예시 | 오류 원인 | 해결 방법 |
|---|---|---|
SELECT TO_DATE('2025-07-25') FROM DUAL; |
날짜 포맷을 지정하지 않음 | SELECT TO_DATE('2025-07-25', 'YYYY-MM-DD') FROM DUAL; |
INSERT INTO orders (order_date) VALUES ('07/25/2025'); |
기본 날짜 포맷과 불일치 | INSERT INTO orders (order_date) VALUES (TO_DATE('07/25/2025','MM/DD/YYYY')); |
SELECT * FROM orders WHERE order_date = '25-JUL-2025'; |
기본 NLS_DATE_LANGUAGE가 영어가 아님 | NLS 설정 확인 또는 TO_DATE('25-JUL-2025','DD-MON-YYYY','NLS_DATE_LANGUAGE=ENGLISH') |
3. ORA-01843 오류의 핵심 원인
- TO_DATE 사용 시 포맷 문자열 누락
- 기본
NLS_DATE_FORMAT값과 문자열 불일치 NLS_DATE_LANGUAGE값이 다를 경우 영어 월이 인식되지 않음- YYYY/MM/DD, DD/MM/YYYY 등 혼동되는 날짜 포맷 사용
4. 실무에서 자주 마주치는 시나리오
시나리오 1: 다국어 환경에서의 오류
국내 환경(NLS_LANGUAGE=KOREAN)에서 아래 SQL 실행:
SELECT * FROM orders WHERE order_date = TO_DATE('25-JUL-2025','DD-MON-YYYY');
→ ORA-01843 오류 발생. 이유는 "JUL"이 영어로 작성되어 있고, 현재 세션은 한글을 인식.
해결:
SELECT * FROM orders
WHERE order_date = TO_DATE('25-JUL-2025','DD-MON-YYYY','NLS_DATE_LANGUAGE=ENGLISH');
시나리오 2: UI에서 전달된 JSON 파라미터가 '2025/07/25'
Backend에서 TO_DATE 사용 시 형식 미지정
-- 잘못된 방식
TO_DATE('2025/07/25')
-- 올바른 방식
TO_DATE('2025/07/25', 'YYYY/MM/DD')
5. TO_DATE 함수 사용 시 주의사항
| 항목 | 설명 | 예시 |
|---|---|---|
| 형식 문자열 필수 | 날짜 문자열은 반드시 명시적 형식으로 변환 | TO_DATE('2025-07-25', 'YYYY-MM-DD') |
| 언어 설정 확인 | MON, MONTH 등을 사용할 경우 세션 언어 확인 | NLS_DATE_LANGUAGE = 'ENGLISH' |
| 숫자형 변환 주의 | 문자열 내부에 숫자가 섞여 있어도 포맷 필요 | TO_DATE('20250725', 'YYYYMMDD') |
6. NLS_DATE 설정 확인 및 변경
-- 현재 세션의 날짜 포맷 확인
SELECT * FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT';
-- 임시 세션 변경
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
주의: 세션 변경은 일시적이며 애플리케이션 레벨에서는 항상 TO_DATE에 명시적 포맷을 주는 것이 안전합니다.
7. 문제 예방 팁
- TO_DATE 또는 TO_TIMESTAMP 사용 시 항상 포맷 명시
- 다국어 환경에서는
NLS_DATE_LANGUAGE옵션을 명시 - 날짜 비교 시에는 변환된 DATE 타입끼리 비교
- 서버, 클라이언트 간 날짜 포맷 협의 필요 (REST API 등)
출처
- Oracle® Database SQL Language Reference 19c
- Oracle Support Doc ID 156405.1 – ORA-01843 Troubleshooting Guide
728x90
'Database > Oracle' 카테고리의 다른 글
| [ORACLE] IND 인덱스 완전 정복 : 개념부터 실무 활용까지 (0) | 2025.07.29 |
|---|---|
| [ORACLE] ORA-01917 오류 원인과 완벽 해결 가이드 (0) | 2025.07.29 |
| [ORACLE] ORA-01789 오류 해결 : ORDER BY의 잘못된 위치와 UNION 사용 시 주의사항 (0) | 2025.07.28 |
| [ORACLE] ORA-01741 오류 분석과 해결법 : 부적절한 SELECT 항목 위치 문제 파헤치기 (0) | 2025.07.28 |
| [ORACLE] ORA-01653 오류 해결 가이드 : 테이블스페이스 공간 부족 원인 분석 및 조치 방안 (0) | 2025.07.28 |