首页 文章

Oracle会话时区:Oracle DB会话可以将java.sql.Date转换为正确的时区吗?

提问于
浏览
0

我们有一个审计表(Columns / Types:ID / Number,.. Audited_Date / Date),它使用预准备语句记录审计条目 . 到目前为止,对于不同的上下文,我们为连接设置数据库会话时区,之后我们使用了audited_date列的CURRENT_DATE属性 . 这意味着插入柱子的日期是连接的时间区域,这是重要的 .

现在,我们有一个新要求,即根据审计日志提供的时间戳添加不同的日期 . 类似于以前的审计引擎不必担心时区的方法,有没有办法设置列的日期,而不必像这样做:

TimeZone timeZone = TimeZone.getTimeZone(timezone);
calendar.setTimeZone(timeZone);
preparedStatement.setDate(4, new java.sql.Date(userTimestampMillis), calendar);

我真的不喜欢这样做,因为timezone属性是根据系统环境和其他参数等多个属性决定的 . 应用程序在提取连接的应用程序的全局范围内使用ALTER SESSION SET TIME_ZONE = "CONTEXT_TIMEZONE" . Is there any way to let the DB session handle the timezone conversion?

这两种方法无法将时间戳转换为数据库会话时区 . 如果我没错,他们正在使用JVM时区 .

FAIL1 .

Timestamp timestamp = new Timestamp(userTimestampMillis);
preparedStatement.setTimestamp(4, timestamp);

FAIL2 .

preparedStatement.setObject(4, new java.sql.Date(userTimestampMillis));

非常感谢任何文件 .

1 回答

  • 0

    DATE s不支持时区,因此您可能希望使用 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 ,这基本上只是断开时区信息并且不进行任何转换 .

相关问题