一个由于错误使用interval导致的错误

    今天发现失败了一条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类型,下面这两篇文章都做了详细讲解,
http://www.iteye.com/topic/148943
http://bjtdeyx.iteye.com/blog/1447301
下面就说一下如何解决这个问题,
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的知识,还是不错的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值