【转】 Oracle 日期小时显示问题
2010-04-01 13:23
381 查看
Oracle 日期小时显示问题
http://hi.baidu.com/38608338/blog/item/ecd124ecc0f303dfb31cb197.html
2010-01-29 10:23
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中,date类型的数据的取值范围是从-4712/12/31到9999/12/31之间,并且年份不能为0。也就是说'0000/00/00'是一个非法数据,不为oracle所接受。
但为什么在数据中还是出现了'0000/00/00'呢?对此问题稍微研究了一下,发现oracle在date类型的数据问题上确实存在一些bug,通过一些特殊方法还是能使date类型存储'0000/00/00'数据。先看以下操作,这是bug之一。
在使用date关键字时,时间格式是罗马格式。此时,我们发现oracle没有对年份是否为0进行校验。并且,只要年份为0,数据都会被转变为'0000/00/00'。
再看另外一种情况,
可以看到,oracle对时间表达式的结果也没有校验年份是否为0,结合上面的bug,只要计算结果年份为0,无论月、日数值,结果都为'0000/00/00'。
再看第三种情况,就更加特殊了:只要对100到1500年之内的所有整百年的日期进行计算,如果结果为2月29的话,结果都为'0000/00/00'。
最后一种情况,如果日期表达式的结果小于0,结果都为'0000/00/00'。
顺便要说的是,以上结果不仅可以被查询出来,而且也能被存储在字段类型为date的表中。
http://hi.baidu.com/38608338/blog/item/ecd124ecc0f303dfb31cb197.html
2010-01-29 10:23
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中,date类型的数据的取值范围是从-4712/12/31到9999/12/31之间,并且年份不能为0。也就是说'0000/00/00'是一个非法数据,不为oracle所接受。
[code]SQL> select to_date('0000-00-00', 'yyyy-mm-dd') from dual;
[code]
[code]select to_date('0000-00-00', 'yyyy-mm-dd') from dual
[code]
[code]ORA-01843: not a valid month
[code]
[code]SQL> select to_date('0000-01-01', 'yyyy-mm-dd') from dual;
[code]
[code]select to_date('0000-01-01', 'yyyy-mm-dd') from dual
[code]
[code]ORA-01841: (full) year must be between -4713 and +9999, and not be 0
但为什么在数据中还是出现了'0000/00/00'呢?对此问题稍微研究了一下,发现oracle在date类型的数据问题上确实存在一些bug,通过一些特殊方法还是能使date类型存储'0000/00/00'数据。先看以下操作,这是bug之一。
[code]SQL> select date '0000-01-01' from dual;
[code]
[code]DATE'0000-01-01'
[code]----------------
[code]0/0/0000
[code]
[code]SQL> select date '0000-11-22' from dual;
[code]
[code]DATE'0000-11-22'
[code]----------------
[code]0/0/0000
在使用date关键字时,时间格式是罗马格式。此时,我们发现oracle没有对年份是否为0进行校验。并且,只要年份为0,数据都会被转变为'0000/00/00'。
再看另外一种情况,
[code]SQL> select to_date('0001-01-01', 'yyyy-mm-dd')-365 from dual;
[code]
[code]TO_DATE('0001-01-01','YYYY-MM-
[code]------------------------------
[code]0/0/0000
[code]
[code]SQL> select to_date('0001-01-01', 'yyyy-mm-dd')-360 from dual;
[code]
[code]TO_DATE('0001-01-01','YYYY-MM-
[code]------------------------------
[code]0/0/0000
可以看到,oracle对时间表达式的结果也没有校验年份是否为0,结合上面的bug,只要计算结果年份为0,无论月、日数值,结果都为'0000/00/00'。
再看第三种情况,就更加特殊了:只要对100到1500年之内的所有整百年的日期进行计算,如果结果为2月29的话,结果都为'0000/00/00'。
[code]SQL> select date '0099-2-28' +1 from dual;
[code]
[code]DATE'0099-2-28'+1
[code]-----------------
[code]3/1/0099
[code]
[code]SQL> select date '0100-2-28' +1 from dual;
[code]
[code]DATE'0100-2-28'+1
[code]-----------------
[code]0/0/0000
[code]
[code]SQL> select date '1000-2-28' +1 from dual;
[code]
[code]DATE'1000-2-28'+1
[code]-----------------
[code]0/0/0000
[code]
[code]SQL> select date '1000-2-28' +2 from dual;
[code]
[code]DATE'1000-2-28'+2
[code]-----------------
[code]3/1/1000
[code]
[code]SQL> select date '1000-2-27' +2 from dual;
[code]
[code]DATE'1000-2-27'+2
[code]-----------------
[code]0/0/0000
[code]
[code]SQL> select date '1500-2-28' +1 from dual;
[code]
[code]DATE'1500-2-28'+1
[code]-----------------
[code]0/0/0000
[code]
[code]SQL> select date '1600-2-28' +1 from dual;
[code]
[code]DATE'1600-2-28'+1
[code]-----------------
[code]2/29/1600
最后一种情况,如果日期表达式的结果小于0,结果都为'0000/00/00'。
[code]SQL> select date '-0001-11-11' +1 from dual;
[code]
[code]DATE'-0001-11-11'+1
[code]-------------------
[code]0/0/0000
[code]
[code]SQL> select date '-4712-11-11' +15 from dual;
[code]
[code]DATE'-4712-11-11'+15
[code]--------------------
[code]0/0/0000
[code]
[code]SQL> select date '-1111-10-11' +0 from dual;
[code]
[code]DATE'-1111-10-11'+0
[code]-------------------
[code]0/0/0000
[code]
[code]SQL> select to_date('01/01/01', 'yyyy/mm/dd') - 900 from dual;
[code]
[code]TO_DATE('01/01/01','YYYY/MM/DD
[code]------------------------------
[code]0/0/0000
顺便要说的是,以上结果不仅可以被查询出来,而且也能被存储在字段类型为date的表中。
相关文章推荐
- Oracle日期显示问题以及trunc方法的使用
- Oracle日期显示问题以及trunc方法的使用 推荐
- 有关oracle遇到日期显示问题,导入导出,安装,卸载,修改listener配置文件,创建用户和表空间等的部分问题.
- Oracle如何解决日期格式“01-3月 -18”的显示问题(3种处理方式)
- 关于oracle中纵向记录横向显示的问题举例说明
- oracle 日期问题 网上找到自己查阅时方便
- Oracle中较长number型数值的科学计数显示问题
- ORACLE SQL Developer日期显示格式设置
- oracle中所有关于时间日期的问题总结
- SSH Secure Shell Client连接Linux 命令行显示中文乱码问题 和oracle 查询数据中文乱码问题
- Oracle 数据同步slqserver 日期转换问题
- GridView中显示时间日期格式等问题
- 影响ORACLE汉字显示的字符集问题
- oracle中的日期格式问题
- oracle"date"显示不全的问题
- 取从textarea中存到MYSQL的数据以原格式显示问题以及解决MySQL日期处理和标签的使用
- Oracle 改服务器中日期显示出来的格式
- [技术] 在水晶报表(Crystal Report)中时间日期显示的问题
- oracle一些常用的函数(substr,日期加减问题)之我见
- 关于oracle字段到jsp前台显示验证中的长度限制问题