今天发现失败了一条UT用例,失败原因是由于在向数据库插入时间时,时间的值是通过如下语句查询出来的
select sysdate - interval '4' month from dual;
这句SQL的意思就是查询4个月前的今天,但是由于使用了interval '4' month这种方式,查询的是绝对时间距离,就是说这句查询等于当前时间,只是月份-4,其余的都不变,而今天又是一个特殊的日子,是什么日子呢,就是举世无双的公元2012年6月30日,那通过sysdate - interval '4' month计算的结果就是2012年2月30日,就连幼儿园的小朋友都知道,世界上肯定没有这一天,所以该语句执行肯定失败,结果就导致用例失败了,但是为什么昨天没有失败呢??那是因为今年是2012年了(神奇的年份),是闰年,所以昨天计算结果就是2012年2月29日,这个日期是正确的。
关于Oracle的interval类型,下面这两篇文章都做了详细讲解,
[url]http://www.iteye.com/topic/148943[/url]
[url]http://bjtdeyx.iteye.com/blog/1447301[/url]
下面就说一下如何解决这个问题,
1、非常简单,直接把月换算成日,即采用如下方式:
select sysdate -122 from dual;
经验证,这种方式是采用日期相减,即从当前日期向前推算有效日期,绝对不会出现不存在的日期
2、采用Oracle自带ADD_MONTHS(x, y)函数,该函数用于计算x加上y个月的结果。如果y是负数,就从x中减去y个月。所以上述语句又可以更改为如下
select ADD_MONTHS(sysdate,-4) from dual;
其实出现这个错误,主要是不完全了解interval这种类型,直接拿来就用,所以才出出现如此低级错误,不过从这个错误中倒是可以学到一点Oracle的知识,还是不错的
select sysdate - interval '4' month from dual;
这句SQL的意思就是查询4个月前的今天,但是由于使用了interval '4' month这种方式,查询的是绝对时间距离,就是说这句查询等于当前时间,只是月份-4,其余的都不变,而今天又是一个特殊的日子,是什么日子呢,就是举世无双的公元2012年6月30日,那通过sysdate - interval '4' month计算的结果就是2012年2月30日,就连幼儿园的小朋友都知道,世界上肯定没有这一天,所以该语句执行肯定失败,结果就导致用例失败了,但是为什么昨天没有失败呢??那是因为今年是2012年了(神奇的年份),是闰年,所以昨天计算结果就是2012年2月29日,这个日期是正确的。
关于Oracle的interval类型,下面这两篇文章都做了详细讲解,
[url]http://www.iteye.com/topic/148943[/url]
[url]http://bjtdeyx.iteye.com/blog/1447301[/url]
下面就说一下如何解决这个问题,
1、非常简单,直接把月换算成日,即采用如下方式:
select sysdate -122 from dual;
经验证,这种方式是采用日期相减,即从当前日期向前推算有效日期,绝对不会出现不存在的日期
2、采用Oracle自带ADD_MONTHS(x, y)函数,该函数用于计算x加上y个月的结果。如果y是负数,就从x中减去y个月。所以上述语句又可以更改为如下
select ADD_MONTHS(sysdate,-4) from dual;
其实出现这个错误,主要是不完全了解interval这种类型,直接拿来就用,所以才出出现如此低级错误,不过从这个错误中倒是可以学到一点Oracle的知识,还是不错的