[ORACLE] ORA-01839: date not valid for month specified 오류 해결 방법
-
반응형
ORA-01839: date not valid for month specified 오류 해결 방법
1. 오류 발생 원인
ORA-01839: date not valid for month specified 오류는 Oracle에서 날짜 형식 변환 시, 해당 월에 존재하지 않는 날짜를 입력했을 때 발생하는 오류입니다.
예시:
SELECT TO_DATE('20250230', 'YYYYMMDD') FROM DUAL;
2025년 2월은 28일까지밖에 없기 때문에, ‘20250230’은 유효하지 않은 날짜이며, 위 SQL은 에러를 발생시킵니다.
2. 해결 방법 요약
1️⃣ 날짜 유효성 검증 로직 추가
2️⃣ PL/SQL 예외 처리 구문 사용
3️⃣ 월의 마지막 날로 자동 보정
3. 날짜 유효성 검사 예제
입력된 날짜가 해당 월에 존재하는 날짜인지 사전 체크하는 쿼리입니다:
SELECT
CASE
WHEN REGEXP_LIKE('20250230', '^\d{8}$') AND
TO_NUMBER(SUBSTR('20250230', 5, 2)) BETWEEN 1 AND 12 AND
TO_NUMBER(SUBSTR('20250230', 7, 2)) <=
TO_NUMBER(TO_CHAR(LAST_DAY(TO_DATE(SUBSTR('20250230', 1, 6), 'YYYYMM')), 'DD'))
THEN TO_DATE('20250230', 'YYYYMMDD')
ELSE NULL
END AS valid_date
FROM DUAL;
위 로직은 문자열을 분해하여 실제 존재하는 날짜인지 검증합니다.
4. PL/SQL 예외 처리 방식
PL/SQL 환경에서는 TRY-CATCH처럼 예외를 직접 처리할 수 있습니다.
DECLARE
v_date DATE;
BEGIN
BEGIN
v_date := TO_DATE('20250230', 'YYYYMMDD');
DBMS_OUTPUT.PUT_LINE('성공: ' || TO_CHAR(v_date));
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('에러: 유효하지 않은 날짜입니다.');
END;
END;
5. 말일로 자동 보정하는 방법
존재하지 않는 날짜가 들어올 경우, 해당 월의 마지막 날로 자동 보정하는 쿼리입니다.
SELECT
CASE
WHEN TO_NUMBER(SUBSTR('20250230', 7, 2)) >
TO_NUMBER(TO_CHAR(LAST_DAY(TO_DATE(SUBSTR('20250230', 1, 6), 'YYYYMM')), 'DD'))
THEN LAST_DAY(TO_DATE(SUBSTR('20250230', 1, 6), 'YYYYMM'))
ELSE TO_DATE('20250230', 'YYYYMMDD')
END AS adjusted_date
FROM DUAL;
‘20250230’은 없는 날짜이므로 ‘2025-02-28’로 자동 변환됩니다.
6. 마무리
ORA-01839 오류는 단순한 입력 실수처럼 보이지만, 시스템에서 날짜 데이터를 다룰 때 안정성을 떨어뜨릴 수 있는 중요한 문제입니다. 특히 사용자 입력을 통해 날짜가 들어오는 경우, 반드시 사전 검증 또는 예외 처리를 해주는 것이 좋습니다.
SQL로 검증하거나, PL/SQL에서 처리하거나, 자동 보정 로직을 추가하는 방식으로 시스템의 견고함을 높이세요.