oracle add_months FUNCTION 함수 사용 시 주의 사항
- 오늘 2016.2.29 이고 앞으로 1달 후 날짜를 구해 올때
2016.3.31 이 맞을까요?
2016.3.29 이 맞을까요?
oracle add_months FUNCTION 사용시 2016.3.31 결과가 나옵니다.
- 오늘 2016.3.31 이고 앞으로 1달 후 날짜를 구해 올때
2016.4.31 이 맞을까요?
2016.4.30 이 맞을까요?
이 경우는 명확히 2016.4.31 입니다.. - 4월달은 30일까지 있기때문이죠
(oracle add_months FUNCTION 사용시 2016.4.31 결과가 나옵니다.)
결론 : oracle add_months FUNCTION 사용시 요구사항이 무엇인지 에 따라
add_months FUNCTION 대처 할수있는 아래 함수를 사용해야 함다.
아래 함수 사용시 2016.2.29 앞으로 1달 후 날짜 2016.3.28 결과가 나옵니다.
CREATE OR REPLACE FUNCTION TMALL.FN_SP_NON_ANSI_ADD_MONTHS
( vDate DATE,
vMonths INTEGER )
RETURN DATE AS newDate DATE;
/******************************************************************************
NAME: FN_SP_NON_ANSI_ADD_MONTHS
PURPOSE: ADD_MONTHS 마지막 날짜 버그 대응 함수
REVISIONS:
Ver Date Author Description
--------- ---------- --------------- ------------------------------------
1.0 2016-05-18 kkk Created this function.
NOTES:
vDate : 기준날짜
vMonths : 기준날짜로 조회 할 월 -1 +1..
newDate : 결과 값
EX) SELECT FN_SP_NON_ANSI_ADD_MONTHS(to_date('2016-02-28','YYYY-MM-DD'), 1) FROM dual;
newDate : 2016/03/28 00:00:00
******************************************************************************/
BEGIN
newDate := add_months(vDate, vMonths);
IF to_char(vDate, 'DD') < to_char(newDate, 'DD') THEN
newDate := vDate + numtoyminterval(vMonths, 'month');
END IF;
RETURN newDate;
END FN_SP_NON_ANSI_ADD_MONTHS;