Oracle ORA-00975 오류 원인과 해결 방법 완벽 가이드

ORA-00975
2026년 06월 23일 | DBMS Error 가이드

이 글에서 다루는 내용

ORA-00975 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.

ORA-00975 date + date not allowed 는?

ORA-00975 에러는 Oracle SQL에서 두 개의 DATE 타입 값을 덧셈 연산자(+)로 직접 더하려 할 때 발생하는 오류입니다. Oracle의 날짜 산술 규칙에 따르면, DATE + DATE 연산은 의미론적으로 유효하지 않으며, DATE 값에는 숫자(일 수)만 더하거나 빼는 것이 허용됩니다. 이 에러는 처음 Oracle을 접하는 개발자나 다른 DBMS에서 마이그레이션된 코드에서 특히 자주 나타납니다.


주요 발생 원인

  • 두 DATE 컬럼을 직접 덧셈 연산으로 합산하려는 시도

가장 흔한 원인은 두 개의 DATE 타입 컬럼 또는 리터럴을 + 연산자로 합산하려는 잘못된 시도입니다. 예를 들어 주문일자와 배송예정일을 더해 어떤 “합산 날짜”를 구하려는 로직은 Oracle에서는 허용되지 않습니다. DATE는 내부적으로 숫자로 저장되지만, 날짜와 날짜의 합은 현실 세계에서 아무런 의미가 없기 때문에 Oracle이 명시적으로 이를 차단합니다.

  • 암묵적 타입 변환(Implicit Conversion) 실패로 인한 DATE 인식

문자열이나 다른 타입의 값이 컨텍스트에 의해 DATE로 암묵적 변환된 후, 해당 결과가 다른 DATE 값과 덧셈 연산에 사용될 때 발생할 수 있습니다. 개발자가 의도한 것은 단순한 숫자 덧셈이었으나, Oracle이 해당 값을 DATE로 해석하여 ORA-00975가 발생하는 경우입니다. 특히 NLS_DATE_FORMAT 설정에 따라 특정 숫자 형식이 날짜로 오인될 수 있습니다.

  • 잘못된 날짜 간격 계산 로직

두 날짜 사이의 중간 날짜(midpoint)를 구하거나 날짜들의 평균을 계산하려 할 때, 수학적으로 (날짜1 + 날짜2) / 2 방식을 그대로 SQL에 적용하는 경우입니다. 이는 수학적으로는 논리적이어 보이나, Oracle은 DATE + DATE 자체를 허용하지 않으므로 에러가 발생합니다. 이 경우 날짜 차이를 숫자로 변환하여 계산하는 방식으로 우회해야 합니다.


해결 방법

원인 1 해결: DATE + DATE 대신 DATE + 숫자 사용

DATE 컬럼에 특정 일수를 더하거나 빼야 할 때는 숫자 리터럴을 사용합니다.

-- 잘못된 예시 (ORA-00975 발생)
SELECT order_date + ship_date
FROM orders;

-- 올바른 예시: 날짜에 숫자(일 수)를 더함
SELECT order_date + 7 AS delivery_estimate
FROM orders;

-- 올바른 예시: 특정 날짜로부터 N일 후 계산
SELECT SYSDATE + 30 AS next_month_date
FROM dual;

원인 2 해결: 명시적 타입 변환 사용

암묵적 변환에 의존하지 말고, TO_DATE, TO_NUMBER 등 명시적 변환 함수를 활용합니다.

-- 잘못된 예시: 문자열이 DATE로 암묵적 변환된 후 덧셈 시도
SELECT TO_DATE('2024-01-15', 'YYYY-MM-DD') + TO_DATE('2024-02-20', 'YYYY-MM-DD')
FROM dual;

-- 올바른 예시: 날짜에 숫자를 더하도록 명확히 지정
SELECT TO_DATE('2024-01-15', 'YYYY-MM-DD') + 30 AS result_date
FROM dual;

-- 올바른 예시: INTERVAL을 사용한 날짜 연산
SELECT TO_DATE('2024-01-15', 'YYYY-MM-DD') + INTERVAL '1' MONTH AS next_month
FROM dual;

원인 3 해결: 두 날짜의 중간값(Midpoint) 계산

두 날짜 간의 중간 날짜를 구할 때는 날짜 뺄셈으로 간격을 숫자로 구한 뒤 계산합니다.

-- 잘못된 예시 (ORA-00975 발생): 두 날짜의 평균을 직접 계산
SELECT (start_date + end_date) / 2 AS midpoint_date
FROM project_schedule;

-- 올바른 예시: 날짜 차이를 이용한 중간 날짜 계산
SELECT start_date + (end_date - start_date) / 2 AS midpoint_date
FROM project_schedule;

-- 실제 실행 가능한 예시
SELECT 
    TO_DATE('2024-01-01', 'YYYY-MM-DD') AS start_date,
    TO_DATE('2024-12-31', 'YYYY-MM-DD') AS end_date,
    TO_DATE('2024-01-01', 'YYYY-MM-DD') + 
        (TO_DATE('2024-12-31', 'YYYY-MM-DD') - TO_DATE('2024-01-01', 'YYYY-MM-DD')) / 2 
        AS midpoint_date
FROM dual;

INTERVAL 타입 활용 (고급 해결책)

Oracle의 INTERVAL 타입을 활용하면 보다 명확하고 안전한 날짜 연산이 가능합니다.

-- 월 단위 날짜 추가
SELECT SYSDATE + INTERVAL '3' MONTH AS three_months_later FROM dual;

-- 시간, 분, 초 단위 추가
SELECT SYSDATE + INTERVAL '1 02:30:00' DAY TO SECOND AS future_time FROM dual;

-- ADD_MONTHS 함수를 활용한 월 계산
SELECT ADD_MONTHS(SYSDATE, 6) AS six_months_later FROM dual;

-- 두 날짜 사이의 일수 차이 (DATE - DATE = NUMBER)
SELECT 
    TO_DATE('2024-12-31', 'YYYY-MM-DD') - TO_DATE('2024-01-01', 'YYYY-MM-DD') AS days_diff
FROM dual;

예방 방법

  • 날짜 연산 표준 가이드라인 수립 및 코드 리뷰 적용

팀 내 SQL 코딩 표준에 “DATE 타입 간 직접 덧셈 금지” 규칙을 명문화하고, 코드 리뷰 체크리스트에 포함시킵니다. 정적 분석 도구(SQL Analyzer, SonarQube 등)를 CI/CD 파이프라인에 통합하여 DATE + DATE 패턴을 자동으로 감지하도록 설정하면 운영 환경에 잘못된 SQL이 배포되는 것을 사전에 방지할 수 있습니다. 또한 신규 개발자 온보딩 시 Oracle 날짜 산술의 기본 규칙(DATE + NUMBER = DATE, DATE – DATE = NUMBER)을 필수 교육 항목으로 포함시키는 것이 좋습니다.

  • 명시적 데이터 타입 변환과 INTERVAL 타입 적극 활용

암묵적 타입 변환에 의존하지 않고, 모든 날짜 연산에서 TO_DATE, TO_TIMESTAMP, NUMTODSINTERVAL, NUMTOYMINTERVAL 등의 명시적 변환 함수를 사용하는 습관을 들입니다. 특히 달(Month)이나 연(Year) 단위 날짜 계산에는 ADD_MONTHS 함수나 INTERVAL 타입을 사용하면 윤년, 월말 처리 등의 엣지 케이스도 Oracle이 자동으로 처리해 주므로 더 안전하고 가독성 높은 코드를 작성할 수 있습니다.


관련 에러

  • ORA-00932: inconsistent datatypes — 날짜 타입과 호환되지 않는 타입 간 연산 시 발생하며, ORA-00975와 유사한 맥락에서 나타납니다.
  • ORA-01722: invalid number — 날짜 연산 중 숫자로 변환 불가능한 값이 개입될 때 발생합니다.
  • ORA-01858: a non-numeric character was found where a numeric was expected — 잘못된 날짜 형식 문자열을 DATE로 변환할 때 발생하며, 날짜 연산 전처리 단계에서 마주칠 수 있습니다.
  • ORA-01839: date not valid for month specified — 존재하지 않는 날짜(예: 2월 30일)를 사용할 때 발생하는 에러로, 날짜 계산 로직에서 주의가 필요합니다.

DBMS 에러 코드 시리즈

주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.

본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.

댓글 남기기