【发布时间】:2019-01-04 03:32:18
【问题描述】:
我们有一个审计表(列/类型:ID/编号,.. Audited_Date/Date),它使用准备好的语句记录审计条目。到目前为止,对于不同的上下文,我们为连接设置了数据库会话时区,之后我们对 audited_date 列使用了 CURRENT_DATE 属性。这意味着插入列中的日期位于重要的连接时区中。
现在,我们有一项新要求,即根据为审计日志提供的时间戳添加不同的日期。与之前审计引擎不必担心时区的方法类似,有没有一种方法可以设置列的日期,而无需执行以下操作:
TimeZone timeZone = TimeZone.getTimeZone(timezone);
calendar.setTimeZone(timeZone);
preparedStatement.setDate(4, new java.sql.Date(userTimestampMillis), calendar);
我真的不想这样做,因为时区属性是根据系统环境和其他参数等多个属性决定的。应用程序在从中获取连接的应用程序的全局范围内使用 ALTER SESSION SET TIME_ZONE="CONTEXT_TIMEZONE"。 有没有办法让 DB 会话处理时区转换?
这两种方法无法将时间戳转换为数据库会话时区。如果我没记错的话,他们使用的是 JVM 时区。
失败1。
Timestamp timestamp = new Timestamp(userTimestampMillis);
preparedStatement.setTimestamp(4, timestamp);
失败2。
preparedStatement.setObject(4, new java.sql.Date(userTimestampMillis));
非常感谢任何文档。
【问题讨论】:
标签: java oracle timezone prepared-statement oracle12c