dingjun大师的文章。http://blog.chinaunix.net/uid-7655508-id-3639253.html
也可以参考下http://blog.sina.com.cn/s/blog_854ec93b0101aahp.html
1.ADD_MONTHS函数
1)如果传入的参数是月末,则结果也是月末2)如果传入的参数的天较大,最终加上N月后,达到的结果日期天没有输入的参数的日期天大,则也是月末
3)其他,天数一样
符合第3点
dingjun123@ORADB> SELECT add_months(DATE'2011-12-31',1) FROM dual;
ADD_MONTHS
----------
2012-01-31
1 row selected.
符合第1点,因为11月30日是月末,所以返回2011-12-31日
dingjun123@ORADB> SELECT add_months(DATE'2011-11-30',1) FROM dual;
ADD_MONTHS
----------
2011-12-31
1 row selected.
符合第2点,虽然10-30不是月末,但是+4月到2月最大是29日,返回2月月末
dingjun123@ORADB> SELECT add_months(DATE'2011-10-30',4) FROM dual;
ADD_MONTHS
----------
2012-02-29
1 row selected.
符合第2点,加5个月,3月月末是31日,未到,因此是3月30日
dingjun123@ORADB> SELECT add_months(DATE'2011-10-30',5) FROM dual;
ADD_MONTHS
----------
2012-03-30
1 row selected.
2.INTERVAL
得出与下月相同的天,如果结果超出对应的月份最大天,则不正确
--普通的使用
dingjun123@ORADB> SELECT DATE'2011-12-31'+interval '1' month FROM dual;
DATE'2011-
----------
2012-01-31
1 row selected.
--12月30日,而不是31日
dingjun123@ORADB> SELECT DATE'2011-11-30'+interval '1' month FROM dual;
DATE'2011-
----------
2011-12-30
1 row selected.
--报错,因为2月最大是29日,没有30日,此2月是29日
dingjun123@ORADB> SELECT DATE'2011-10-30'+interval '4' month FROM dual;
SELECT DATE'2011-10-30'+interval '4' month FROM dual
*
ERROR at line 1:
ORA-01839: date not valid for month specified
--正确,3月30日,而不是31日
dingjun123@ORADB> SELECT DATE'2011-10-30'+interval '5' month FROM dual
2 ;
DATE'2011-
----------
2012-03-30
1 row selected.