[개발] 프로그램 지식

[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에서 처리하거나, 자동 보정 로직을 추가하는 방식으로 시스템의 견고함을 높이세요.

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.