Home  >  Article  >  Database  >  Oracle 小时显示问题

Oracle 小时显示问题

WBOY
WBOYOriginal
2016-06-07 16:55:50920browse

select to_date(

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的一个bug? 目前没找到好的解决方法。

Oracle时间类型数据为0的bug

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

oracle所接受。

SQL> select to_date('0000-00-00', 'yyyy-mm-dd') from dual;select to_date('0000-00-00', 'yyyy-mm-dd') from dualORA-01843: not a valid monthSQL> select to_date('0000-01-01', 'yyyy-mm-dd') from dual;select to_date('0000-01-01', 'yyyy-mm-dd') from dualORA-01841: (full) year must be between -4713 and +9999, and not be 0

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

SQL> select date '0000-01-01' from dual;DATE'0000-01-01'----------------0/0/0000SQL> select date '0000-11-22' from dual;DATE'0000-11-22'----------------0/0/0000

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

再看另外一种情况,,

SQL> select to_date('0001-01-01', 'yyyy-mm-dd')-365 from dual;TO_DATE('0001-01-01','YYYY-MM-------------------------------0/0/0000SQL> select to_date('0001-01-01', 'yyyy-mm-dd')-360 from dual;TO_DATE('0001-01-01','YYYY-MM-------------------------------0/0/0000

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

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

SQL> select date '0099-2-28' +1 from dual;DATE'0099-2-28'+1-----------------3/1/0099SQL> select date '0100-2-28' +1 from dual;DATE'0100-2-28'+1-----------------0/0/0000SQL> select date '1000-2-28' +1 from dual;DATE'1000-2-28'+1-----------------0/0/0000SQL> select date '1000-2-28' +2 from dual;DATE'1000-2-28'+2-----------------3/1/1000SQL> select date '1000-2-27' +2 from dual;DATE'1000-2-27'+2-----------------0/0/0000SQL> select date '1500-2-28' +1 from dual;DATE'1500-2-28'+1-----------------0/0/0000SQL> select date '1600-2-28' +1 from dual;DATE'1600-2-28'+1-----------------2/29/1600

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

SQL> select date '-0001-11-11' +1 from dual;DATE'-0001-11-11'+1-------------------0/0/0000SQL> select date '-4712-11-11' +15 from dual;DATE'-4712-11-11'+15--------------------0/0/0000SQL> select date '-1111-10-11' +0 from dual;DATE'-1111-10-11'+0-------------------0/0/0000SQL> select to_date('01/01/01', 'yyyy/mm/dd') - 900 from dual;TO_DATE('01/01/01','YYYY/MM/DD------------------------------0/0/0000

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

linux

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn