임동문의 횡설수설

dmlim.egloos.com

포토로그


라이프로그


4년에 한번씩 발생했던 오라클 날짜연산의 문제 프로그래밍

오라클 스토어드 프로시져 중에 날짜 연산을 하기 위한 코드가 있었는데..

30 년전 오늘의 날짜를 구하는 연산이다.

SELECT SYSDATE - TO_YMINTERVAL('30-00') FROM DUAL

얼핏 보면 문제가 없어 보인다.. 그러나 SYSDATE 가 4년에 한번씩 오는 2월 29일 되면 오류가 발생한다.

1978-02-29 이라는 날짜는 존재 하지 않기 때문이다... (쉬트...)

그래서 아래와 같이 수정했다.

SELECT ADD_MONTHS(SYSDATE, -12*30) FROM DUAL


이렇게 연산을 하면 1978-02-28 이라는 결과가 나온다.

못 믿으시겠다고요? 그럼 아래 쿼리를 각각 실행해 보시라..

SELECT TO_DATE('2008-02-29', 'YYYY-MM-DD') + TO_YMINTERVAL('01-00') FROM DUAL

SELECT ADD_MONTHS(TO_DATE('2008-02-29', 'YYYY-MM-DD'), -12*30) FROM DUAL


이 현상은 9.2.0.4 에서 목격되었다.. 상위 버전을 써본적이 없어서 10g 나 11g 에서도 여전히 발생하는지는 모르겠다.

사실 이 문제는 4년전에도 똑같이 겪었다... 소 잃고 외양간도 못 고쳤다... 오늘 또 이런 오류를 겪었다니.. 쩝..


핑백

덧글

  • 백탄왕 2008/02/29 09:59 # 답글

    와.. 왼쪽 캐리캐쳐 사진이, 완전
    프로그래머 같으세요~! ㅋㅋ
  • 제뚜빠빠 2009/04/14 16:21 # 삭제 답글

    이런 경우는 현재 달의 마지막 날짜를 구해서 구한 날짜보다 크면 현재 달의 마지막 날짜로 지정하면 됩니다.
댓글 입력 영역