PreparedStatement and setTimestamp in oracle jdbc

我在 where 子句中使用带有时间戳的准备语句:

PreparedStatement s=c.prepareStatement("select value,utctimestamp from t where utctimestamp>=? and utctimestamp<?"); 
s.setTimestamp(1, new Timestamp(1273017600000L));   //2010-05-05 00:00 GMT
s.setTimestamp(2, new Timestamp(1273104000000L));   //2010-05-06 00:00 GMT
ResultSet rs = s.executeQuery();
if(rs.next()) System.out.println(rs.getInt("value"));

当我在客户端计算机上具有不同的时区时,我得到的结果是不同的。这是Oracle jdbc中的一个错误吗?或正确的行为?

Oracle数据库版本是10.2,我已经尝试使用oracle jdbc精简驱动程序版本10.2和11.1。

参数是时间戳,我预计在途中不会进行任何时间转换。数据库列类型是 DATE,但我也使用具有相同结果的 TIMESTAMP 列类型对其进行了检查。

有没有办法达到正确的结果?我无法将整个应用程序中的默认时区更改为 UTC。

感谢您的帮助


答案 1

要在 UTC 时区中的预准备语句中设置时间戳值,应使用

stmt.setTimestamp(1, t, Calendar.getInstance(TimeZone.getTimeZone("UTC")))

时间戳值始终为 UTC,但 jdbc 驱动程序并不总是可以自动将其正确发送到服务器。第三个参数是 Calendar,可帮助驱动程序正确准备服务器的值。


答案 2