임동문의 횡설수설

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년전에도 똑같이 겪었다... 소 잃고 외양간도 못 고쳤다... 오늘 또 이런 오류를 겪었다니.. 쩝..


트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://dmlim.egloos.com/tb/4189840 [도움말]

덧글

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

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

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