当前位置: 首页 > 面试题库 >

Oracle jdbc中的PreparedStatement和setTimestamp

商飞龙
2023-03-14
问题内容

我在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中的错误吗?或正确的行为?

Oracle数据库版本为10.2,并且我尝试使用Oracle jdbc瘦驱动程序版本10.2和11.1。

参数为时间戳,我希望途中不会进行任何时间转换。数据库列类型为DATE,但我还使用TIMESTAMP列类型对其进行了检查,结果相同。

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

谢谢你的帮助


问题答案:

要在UTC时区的PreparedStatement中设置时间戳记值,应使用

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

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



 类似资料:
  • Eclipse显示警告消息,表示"资源泄漏,准备好的语句未在以下位置关闭" 在我看来,finally块负责关闭preparedstatement和rs对象。你知道为什么eclipse还在抱怨资源泄漏吗?

  • 主要内容:1. Statement对象,2. PreparedStatement对象,3. CallableStatement对象,关闭CallableStatement对象当获得了与数据库的连接后,就可以与数据库进行交互了。 JDBC ,和接口定义了可用于发送SQL或PL/SQL命令,并从数据库接收数据的方法和属性。 它们还定义了有助于在Java和SQL数据类型的数据类型差异转换的方法。 下表提供了每个接口定义,以及使用这些接口的目的的总结。 接口 推荐使用 用于对数据库进行通用访问,在运行时

  • 如果我使用具有“自动提交关闭”的JDBC连接创建一个准备语句,我需要调用提交()来使事务永久化还是只有准备调用就足够了?请注意,我只想准备一个语句并保留它以供以后执行。 非常感谢!

  • 问题内容: “ Prepared Statement”是Statement的稍强版本,并且应始终至少与Statement一样快捷且易于处理。 准备好的语句可能已参数化 大多数关系数据库通过四个步骤来处理JDBC / SQL查询: 解析传入的SQL查询 编译SQL查询 规划/优化数据采集路径 执行优化的查询/获取并返回数据 对于发送到数据库的每个SQL查询,一个Statement将始终执行上述四个步

  • 问题内容: 我想知道有什么区别,何时使用,和。 每种方法的最佳实践和典型方案是什么? 问题答案: 声明与PreparedStatement 使用PreparedStatement可以提高性能,但它取决于数据库。 使用PreparedStatement可以避免SQL注入。PreparedStatement如何避免或阻止SQL注入? 使用setInt,setString和prepareStatemen

  • 问题内容: 为了使我们的代码更加标准,我们被要求更改将SQL变量硬编码为预处理语句的所有位置,然后绑定这些变量。 但是我遇到了问题。 这是代码: 我在执行SQL时收到此错误: 我应该改为使用? 问题答案: Using 使用 如果您的表的列类型为: 该方法接收到一个字符串,该字符串表示格式为日期的日期。例如: 假设您有一个type类型的变量,则可以这样进行转换: 当前的 如果要插入当前日期: Usi