【问题标题】:Oracle session timezone: Can Oracle DB session convert java.sql.Date to correct timezone?Oracle 会话时区:Oracle DB 会话能否将 java.sql.Date 转换为正确的时区?
【发布时间】: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


    【解决方案1】:

    DATEs 不支持时区,因此您可能希望使用 TIMESTAMP WITH TIME ZONE 数据类型中的某些内容。你说你可以正确设置数据库会话时区,所以你大部分时间都在那里。假设您在洛杉矶,而我的数据库会话在芝加哥:

    alter session set time_zone = 'America/Chicago';
    
    Session altered.
    
    select current_timestamp from dual;
    
    CURRENT_TIMESTAMP                            
    ---------------------------------------------
    2018-07-27 20:30:28.672000000 AMERICA/CHICAGO
    
    select cast( current_timestamp at time zone 'America/Los_Angeles' as date ) as d from dual;
    
    D                  
    -------------------
    2018-07-27 18:30:28
    

    所以您基本上需要使用AT TIME ZONETIMESTAMP WITH TIME ZONE 转换为正确的时区,然后使用CAST ( ... AS DATE ) 将其转换为DATE,这基本上只是截断了时区信息并且不会不做任何转换。

    【讨论】:

    • 不要认为这对我有帮助。有没有办法说`插入表...值(.., at $CURRENT_DB_TIMEZONE)?
    • AT TIME ZONE 就是这样做的。
    猜你喜欢
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2012-05-19
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多