gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:50:11 25 4
gpt4 key购买 nike

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

在预处理语句中,宿主变量“f.plan_date = ?”应该与 java.util.Date 对象的值绑定(bind),作为在代码其他地方获得的输入。 Oracle 表中的列数据类型是“DATE”,只应考虑日期部分 - 时间无关紧要。

我按以下方式将 java.util.Date 对象翻译成 java.sql.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 日期值没有时间部分。” (方法“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),绑定(bind)了 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

这与API中的文档不符:

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.

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

关于java - OJBC 客户端升级后更改了 java.sql.Date 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25450452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com