본문 바로가기
Database/Oracle

[ORACLE] ORA-01843 오류 분석과 해결법 : 날짜 형식 문제 완벽 가이드

by Papa Martino V 2025. 7. 28.
728x90

ORA-01843 오류 분석과 해결법 : 날짜 형식 문제 완벽 가이드
[ORACLE] ORA-01843

 

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