ORACLE的JDBC DRIVER的GETDATE存在BUG.

来源:互联网 发布:淘宝欢乐逛在哪里 编辑:程序博客网 时间:2024/06/05 18:38

 

问题描述:

       在做度量统计的程序中, 当计算度量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

 

 

 

 

 

 

 

 

 

原创粉丝点击