add_months 和interval 的区别

来源:互联网 发布:厦门住宿推荐 知乎 编辑:程序博客网 时间:2024/05/01 02:34

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.
0 0
原创粉丝点击