ORACLE的JDBC DRIVER的GETDATE存在BUG.

10 篇文章 0 订阅
 
 
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");          
  TimeZone.setDefault(TimeZone.getTimeZone("America/New_York"));
  Date dateWithoutTime = sdf.parse(sdf.format(new Date()));
 
Wed May 23 00:30:00 EDT 2012
 
local eclipse test, if don't set timezone, it will be  Wed May 23 00:00:00 VET 2012, but oracle timezone is America/New_York, so when comparing local date to db retrieved date, they can't equal.
 
but when deployed to linux server that is located in NY, they will equal.
 
java.util.Date.euqals(Timestamp) alwasy return false
 
 

问题描述:

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

 

解决途径一:

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

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

   解决方法:

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

       显然这是因为时区不一致造成的, 即使将所有这些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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值