【问题标题】:Oracle 12c ojdbc7 driver causing issues with result.getString("DATE_COLUMN")Oracle 12c ojdbc7 驱动程序导致 result.getString("DATE_COLUMN") 出现问题
【发布时间】:2017-04-27 21:36:06
【问题描述】:

我们正在升级到 Oracle 12c,因此正在使用 ojdbc7(12.1.0.2.0) 驱动程序。但是我们注意到,当使用 resultSet.getString("DATE_COLUMN") 从表中获取 DATE 列时,它现在也返回夏令时调整时间。请注意,数据库位于 CST 美国时区。

例如说

如果最初插入的列中的日期是“2014-03-09 02:30:00”,顺便说一下,这是 2014 年美国开始实行夏令时的日期。

这是用于获取此值的代码行。

  String sql = "SELECT DATE_COLUMN FROM A_TABLE";
     ResultSet rs = psmt.executeQuery(sql);
     while (rs.next())
     {
        String dateString = rs.getString("DATE_COLUMN");
     }

以下是这段代码 sn-p 与 2 个不同驱动程序的结果。

odjbc6(11.2.0.3.0) - 2014-03-09 02:30:00

ojdbc7(12.1.0.2.0) - 2014-03-09 03:30:00.0

如果您看到突出显示的时间字段,您可以看到它现在使用 ojdbc7 驱动程序获取 3:30:00.0 而不是 2:30,这表明驱动程序正在获取当地时区的夏令时调整时间数据库服务器,在我们的例子中是美国 CST。

我得到了链接ResultSet.getString(Date) differs based on driver中提到的附加小数秒的部分

问题是我们不需要夏令时调整时间,但需要最初插入的时间。但是,使用 resultSet.getDate() 等其他获取日期的方式,resultSet.getTimeStamp() 也会返回 DST 调整后的时间。

我们发现唯一的出路就是将日期列的类型改为TIMESTAMP,问题就解决了。

有人遇到过 oracle 12c(ojdbc7) 驱动的这个问题吗?

如果是,有没有更好的解决方法?我真的很想避免将现有列的数据类型更改为 TIMESTAMP。

【问题讨论】:

  • 在 12.1.0.1 ojdbc7.jar 的发行说明中列出了此修复程序。 9869716 打印 TIMESTAMPTZ 的字符串值对默认时区敏感 将 TIMESTAMPTZ 转换为字符串会产生错误的结果。
  • 12.1.0.2 发行说明已修复 9785135 DST CONVERSION NOT CORRECT USING JDBC 11G TIMESTAMPTZ 可以构造错误的 TIMESTAMPTZ 值。也许 11.2.0.3.0 驱动程序实现被认为是一个错误。
  • 如果你想得到一个字符串,为什么不使用to_char(),这样你就知道它是如何格式化的了?据推测,这也可以避免这个问题,因为司机永远不会看到日期。如果您希望将其作为日期,则可以将其转换为时间戳,而不是更改列类型,但这有点 hack。
  • 谢谢布赖恩。这是否意味着 resultSet.getString(DATE COLUMN) 将在内部将其转换为带有时区的 TIMESTAMP,并且 11.2.0.3 有一个不正确的修复,现在已在 12.1.0.2 中修复。那么,如果我们不想要 DST 调整时间,我们是否应该将列的类型更改为 TIMESTAMP?
  • 你为什么首先使用getString()?如果那是 datetimestamp 列,您应该使用 getTimestamp()

标签: oracle


【解决方案1】:

有同样的问题。我使用rs.getString(index) 来避免Date 类型的夏令时调整,但使用ojdbc7,rs.getString(index) 也在调整夏令时时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2016-12-10
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    相关资源
    最近更新 更多