Oracle存储日期的TIMESTAMP数据类型是否根据本地时区进行调整?



我有一个java应用程序,它使用Spring JDBC将数据存储到Oracle。这些数据包括时间戳/日期,我们使用这些时间戳/日期在将来查询某些数据。

日期字段在DDL SQL文件中定义如下:

JobExecution {
START_TIME TIMESTAMP DEFAULT NULL ,
END_TIME TIMESTAMP DEFAULT NULL 
...
}

更新这些字段的Java代码如下:

lastJobExecution.setEndTime(new Date(System.currentTimeMillis()));

new Date(System.currentTimeMillis())按照下面的文档以UTC格式存储当前时间。System.currentTimeMillis()的文档说它返回以下内容:

表示当前时间与时间之间的差值,以毫秒为单位UTC时间1970年1月1日午夜。

Date的文档如下:

分配一个Date对象并初始化它以表示指定的日期自标准基准时间(称为"时间")以来的毫秒数epoch",即1970年1月1日00:00:00 GMT。

Params: date -从1970年1月1日00:00:00 GMT开始的毫秒数。参见:System.currentTimeMillis()

然而,当我使用SQL developer连接到oracle数据库时,日期似乎是按照当地时间而不是UTC存储的。

问题:

  1. OracleTIMESTAMP是否根据本地时间调整日期?我在Oracle文档中找不到明确的写。
  2. 如果是,最好的处理方法是什么?一种方法是每次从该表读取数据时都将其转换为UTC。另一种方法是将其存储为UTC格式。

不,TIMESTAMP数据类型不存储任何时区信息。

请参阅日期时间数据类型文档。

Oracle提供了两个时间戳数据类型支持的时区:

  • TIMESTAMP WITH TIME ZONE

顾名思义,它存储带有时区信息的时间戳。时区可以作为地区名称(例如Europe/Zurich)或作为UTC偏移量。注意,不能直接在这样的列上创建索引。相反,Oracle创建一个SYS_EXTRACT_UTC(<your column>)的虚拟列,并在这个虚拟列上创建索引。您可能需要相应地调整您的查询。

通常当您使用时区时,常见的方法是将所有时间存储为UTC时间,然后客户端将其转换为本地时间。这正是由第二个数据类型提供的:

  • TIMESTAMP WITH LOCAL TIME ZONE

TIMESTAMP WITH LOCAL TIME ZONE中,所有值都存储在DBTIMEZONE(默认为UTC),但值总是

显示在当前用户会话时区。另一个注意事项,TIMESTAMP WITH [LOCAL] TIME ZONE值的所有比较(例如<, >, =, >=, <=)都是根据UTC值执行的。

最新更新