oracle——TO_YMINTERVAL andADD_MONTHS

今天做关于日期函数的联系,意外的发现了一个可以叫做bug的地方吧。

这个是关于TO_YMINTERVAL()函数的

TO_YMINTERVAL

Syntax

Description of to_yminterval.gif follows
Description of the illustration to_yminterval.gif

Purpose

TO_YMINTERVAL converts a character string of CHARVARCHAR2NCHAR, or NVARCHAR2 datatype to an INTERVAL YEAR TO MONTH type, where char is the character string to be converted.

Examples

The following example calculates for each employee in the sample hr.employees table a date one year two months after the hire date:

SELECT hire_date, hire_date + TO_YMINTERVAL('01-02') "14 months"
   FROM employees;

HIRE_DATE 14 months
--------- ---------
17-JUN-87 17-AUG-88
21-SEP-89 21-NOV-90
13-JAN-93 13-MAR-94
03-JAN-90 03-MAR-91
21-MAY-91 21-JUL-92

上边这段内容明眼人一看编制出自 oracle的 SQL Reference。

 

言归正传,我所说的bug是这样的,我的表里有这么一个日期‘1980-12-29’,我要算一年两个月之后的日期

SELECT TO_DATE('1980-12-29','YYYY-MM-DD')+TO_YMINTERVAL('01-02') FROM DUAL;

这里就使用了TO_YMINTERVAL()函数,结果我郁闷了,‘ORA-01839 :指定月份的日期无效’。

 看了半天找不到原因后来才发现运算结果会出现这么一个日期‘1981-2-29’(运算之后出现了非闰年的2月29所以报错)。
所以以后要使用这个函数的朋友要注意了。
 
当然在这里可以使用另外一个函数ADD_MONTHS('',NUMBER)来代替,他的处理结果是把非闰年的2月29强制转换为2月28,
SELECT ADD_MONTHS(TO_DATE('1980-12-29','YYYY-MM-DD'),14) FROM DUAL;
--------------------------------------------------------
史朋飞
和阳光的人在一起,心里就不会晦暗;
和快乐的人在一起,嘴角就长带微笑;
学最好的别人,做最好的自己。
2012-04-17

posted on 2012-04-17 22:06  follow_my_heart  阅读(786)  评论(0编辑  收藏  举报

导航