Oracle 小时显示问题

2014-11-24 17:44:52 · 作者: · 浏览: 0

select to_date('2010-1-29 0:00:01', 'yyyy-mm-dd hh24:mi:ss') from dual


显示结果:2010-1-29 上午 12:00:01


尽管在这里显示的结果不正确,但是在asp.net等其他程序中调用时仍然是正确的。



Oracle时间类型数据为0的bug


发组在数据迁移时,报告发现一些数值为'0000/00/00'date数据,导致数据迁移失败。


这个问题有点奇怪,因为在Oracle中,date类型的数据的取值范围是从-4712/12/319999/12/31之间,并且年份不能为0。也就是说'0000/00/00'是一个非法数据,不为oracle所接受。




但为什么在数据中还是出现了'0000/00/00'呢?对此问题稍微研究了一下,发现oracledate类型的数据问题上确实存在一些bug,通过一些特殊方法还是能使date类型存储'0000/00/00'数据。先看以下操作,这是bug之一。




在使用date关键字时,时间格式是罗马格式。此时,我们发现oracle没有对年份是否为0进行校验。并且,只要年份为0,数据都会被转变为'0000/00/00'



再看另外一种情况,




可以看到,oracle对时间表达式的结果也没有校验年份是否为0,结合上面的bug,只要计算结果年份为0,无论月、日数值,结果都为'0000/00/00'



再看第三种情况,就更加特殊了:只要对1001500年之内的所有整百年的日期进行计算,如果结果为229的话,结果都为'0000/00/00'




最后一种情况,如果日期表达式的结果小于0,结果都为'0000/00/00'




顺便要说的是,以上结果不仅可以被查询出来,而且也能被存储在字段类型为date的表中。