OJBC客户端升级后更改了java.sql.Date的行为

将OJDBC客户端从版本11.2.0升级到12.1.0后,我遇到了将java.sql.Date对象绑定到PreparedStatement的不同行为。

在准备好的语句中,主变量“f.plan_date =?” 应该绑定一个java.util.Date对象的值,该对象是代码中其他位置获得的输入。 Oracle表中的列数据类型是“DATE”,只有日期部分应该被考虑 - 时间是不相关的。

我按照以下方式在java.sql.Date对象中转换了java.util.Date对象: statementRegisterJobs.setDate(3, new java.sql.Date(planDate.getTime()));

这对11.2.0客户端来说很好。 但是,在升级到12.1.0之后,事情往往会出错。 没有记录被检索了。 经过几个小时的调试后,我发现问题与日期变量有关。 下面的工作方式给我回我的记录: statementRegisterJobs.setDate(3, java.sql.Date.valueOf("2014-08-21"));

有人能澄清这种行为吗? java.util.Date对象最终可能有一个时间组件,并且我有一种未定义的感觉,这可能与此问题有关。 另一方面,下面的项目应该争辩说,在java.sql.Date中忽略时间组件,不管对象是如何构造的......

  • 在用于java.sql.Date的Java 6 API中,我找到以下语句:“此方法已弃用,因此SQL Date值没有时间组件,因此不应使用此方法。” (方法'getHours()')。 所以这意味着将java.util.Date转换为java.sql.Date时忽略了时间方面。
  • 这通过构造函数文档中的信息得到确认:“使用给定的毫秒时间值构造Date对象如果给定的毫秒值包含时间信息,则驱动程序将时间分量设置为默认时区中的时间(时间运行应用程序的Java虚拟机的区域)对应于零GMT。“
  • 此外,我无法从java.sql.Date对象中获得可能的时间方面:toString()仅给出日期,getHours()抛出异常。
  • 而这又如何与JDBC客户端的更新相关?
  • 任何想法都赞赏:)非常感谢你提前。


    与Java API指出的内容相反,当通过传递毫秒时间值创建java.sql.Date对象时,时间方面似乎存储在对象中,并且在使用12.1.0 OJDBC驱动程序时不会默认为零。

    这是我设置的测试:

    java.util.Date utilDate = new Date();
    java.sql.Date sqlDate1 = new java.sql.Date(utilDate.getTime());
    java.sql.Date sqlDate2 = java.sql.Date.valueOf("2014-08-27");
    

    我准备了下面的语句( SELECT to_char(?, 'YYYY-MM-DD HH24:MI:SS') testDate FROM dual ),绑定了sqlDate1和sqlDate2,并得到了以下结果。

  • 使用驱动程序版本11.2.0

  • sqlDate1: 2014-08-27 00:00:00
  • sqlDate2: 2014-08-27 00:00:00
  • 使用驱动程序版本12.1.0

  • sqlDate1: 2014-08-27 14:47:29
  • sqlDate2: 2014-08-27 00:00:00
  • 这不符合API中的文档:

    如果给定的毫秒值包含时间信息,则驱动程序会将时间组件设置为与零GMT相对应的默认时区(运行应用程序的Java虚拟机的时区) 中的时间

    但是,知道这一点,我可以通过强制sql日期对象的时间信息为午夜来解决问题。

    链接地址: http://www.djcxy.com/p/18527.html

    上一篇: Changed behaviour of java.sql.Date after OJBC client upgrade

    下一篇: converting one time zone to another using joda time