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

时间:2014-08-22 15:21:08

标签: java sql oracle date ojdbc

将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客户端的更新有关?

感谢任何想法:)非常感谢您提前。

1 个答案:

答案 0 :(得分:6)

反对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并获得了以下结果。

  1. 使用驱动程序版本11.2.0

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

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

      

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

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