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

Changed behaviour of java.sql.Date after OJBC client upgrade

从11.2.0版升级到12.1.0版之后,我在将java.sql.date对象绑定到PreparedStatement时遇到了不同的行为。

在准备好的语句中,主机变量"f.plan_date=?"应该与java.util.date对象的值绑定,该值是代码中其他地方获得的输入。Oracle表中的列数据类型为"日期",只应考虑日期部分-时间不相关。

我以以下方式翻译java.sql.date对象中的java.util.date对象:statementRegisterJobs.setDate(3, new java.sql.Date(planDate.getTime()));

这对11.2.0客户机很好。然而,在升级到12.1.0之后,事情往往会出错。不再检索任何记录。经过数小时的调试,我发现这个问题与日期变量有关。以下工作方式将我的记录返回:江户十一〔一〕号

有人能解释一下这种行为吗?日期对象最终可以有一个时间组件,我有一种未定义的感觉,这可能与问题有关。另一方面,无论对象是如何构造的,以下各项都应该说明java.sql.date中忽略了时间组件…

  • 在java. SQLDATA的Java 6 API中,我发现了以下语句:"此方法被弃用,不应该使用,因为SQL日期值没有时间组件。"(方法"GethOrthSe()))。因此,这意味着在将java.util.date转换为java.sql.date时忽略时间方面。
  • 这由构造函数文档中的信息确认:"使用给定的毫秒时间值构造日期对象。如果给定的毫秒值包含时间信息,则驱动程序将时间组件设置为默认时间区(运行应用程序的Java虚拟机的时区)对应于零GMT的时间。
  • 此外,我无法从java.sql.date对象中获得可能的时间方面:toString()只给出日期,gethours()抛出异常。
  • 这与JDBC客户机中的更新有什么关系?

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


opposed to the Java API是美国java.sql.date when creating a模式,通过在对象的显示时间值的时间似乎milliseconds to be stored in the object and is not to when using the 12.1.0 defaulted零ojdbc司机。P></

This is the测试集上:P></

1
2
3
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");

这些由the following statement(SELECT to_char(?, 'YYYY-MM-DD HH24:MI:SS') testDate FROM dual),都有binded sqldate1和sqldate2和下面的结果。P></

  • 与11.2.0驱动程序版本P></

    • sqldate1:2014-08-27 00:00:00
    • sqldate2:2014-08-27 00:00:00
  • 与12.1.0驱动程序版本P></

    • sqldate1:2014-08-27 14:47:29
    • sqldate2:2014-08-27 00:00:00
  • this is not in line with the documentation in the API:P></

    If the given milliseconds value contains time information, the driver
    will set the time components to the time in the default time zone (the
    time zone of the Java virtual machine running the application) that
    corresponds to zero GMT.

    不管一个人多,这个问题可以knowing fix the by the time of the SQL信息forcing to be午夜日期对象。P></