ORACLE的JDBC DRIVER的GETDATE存在BUG.

 

问题描述:

       在做度量统计的程序中, 当计算度量A101-KM28/02/1979 08:00到当前时间的时候,出现了一个很奇怪的现象。当在PL/SQL客户端查询时发现日期是:1987-4-12 1990-4-15 ,而通过HIBERNATE查询得到的却是1987-4-11 1990-4-14

 

解决途径一:

   看到这个现象觉得很奇怪,开始以为是由于程序中的复杂操作造成这个现象,但是经过检查发现并不是这样, 因为直接通过JDBC操作ORACLE DB获取的数据就是如此。于是发现应该是ORACLEJDBC DRIVER有些小BUG, 估计HIBERNATE 是用的GETDATE去获取RESULTSET中的日期, 但是数据库默认的时区设置和我们机器上的时区是不同的, 于是便出现了这种差异。

   JAVATimeZone.getDefault().getID()去获取是Asia/Shanghai 而用SQLselect SESSIONTIMEZONE from dual select DBTIMEZONE from dual;)去取却是GMT 不知道是不是这样? 本人还是有些疑问。

   解决方法:

    1 通过将DATABASE中相应字段改为TIMESTAMP 然后将1987-4-12 设为1987-4-12 010000 在用JAVA获取返回就是1987-4-12 010000 注意:如果设成:1987-4-12 003000 返回就是1987-4-11 233000

       显然这是因为时区不一致造成的, 即使将所有这些DATE设成1点后, 也不能保证以后别的机器的时区相差仅仅一个小时。

    2 通过在应用程序中设置一个默认的时区,TimeZone.setDefault(TimeZone.getTimeZone(GMT);,这个可以配置, 也许这样会更好些。

 

解决途径二:

由于对使用了很久的Oracle JDBC Driver 很信任,认为 Driver不会出现问题,但还是报着试试看的想法写了一段直接用JDBC 存取数据的代码,令人惊讶的是这个日期问题依旧, ResultSetgetDate方法和getString方法取出的数据就是不同的,用getString取出的数据是 1940-6-3 ,是正确的,用getDate取出的日期是1940-6-2是错误的,  问题终于找到了,去Oracle网站找新的驱动(其实我们用的驱动也不是很旧),浏览Oracle的网站才发现,Oracle10g的不同的小版本如:Oracle 10.2.0.1 Oracle 10.2.0.4 都提供了不同的驱动程序。

针对不同的数据库版本下载对应的驱动,问题解决!

      http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值