【发布时间】: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()?如果那是date或timestamp列,您应该使用getTimestamp()
标签: oracle