oracle jdbc中的java PreparedStatement和setTimestamp
我在where子句中使用带时间戳的PreparedStatement:
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中的一个bug吗?还是正确的行为
Oracle数据库版本是10.2,我已经尝试使用Oracle jdbc瘦驱动程序版本10.2和11.1
参数是Timestamp,我希望不会在途中进行时间转换。数据库列类型是DATE,但我也用TIMESTAMP列类型检查了它,结果相同
有没有办法达到正确的结果?我无法将整个应用程序中的默认时区更改为UTC
谢谢你的帮助
# 1 楼答案
要在UTC时区的PreparedStatement中设置时间戳值,应使用
时间戳值始终为UTC,但jdbc驱动程序并不总是能够自动将其正确发送到服务器。第三个参数是Calendar,它帮助驱动程序正确地为服务器准备值