【问题标题】:Does the TIMESTAMP datatype of Oracle store dates adjusted as per the local timezone?Oracle 存储日期的 TIMESTAMP 数据类型是否根据本地时区进行调整?
【发布时间】:2021-12-10 07:27:04
【问题描述】:

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

日期字段在 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 对象并初始化它以表示指定的 自标准基准时间以来的毫秒数,称为“ 纪元”,即 1970 年 1 月 1 日 00:00:00 GMT。

参数:日期 - 自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数。 另见:System.currentTimeMillis()

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

问题:

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

【问题讨论】:

  • 阅读this oracle documentation 似乎TIMESTAMP 存储时间信息而没有进一步的时区信息,即它只存储给出的任何信息。要存储在本地时区,我们将使用TIMESTAMP WITH LOCAL TIME ZONE
  • @MarkRotteveel 它确实部分回答了我的问题。但是,不同之处在于 java 代码可能就是我将数据存储到 Oracle 中的方式。我正在使用 spring JDBC 来存储将日期转换为 TIMESTAMP 数据类型的中间步骤,至少我并不清楚。
  • 最好的办法可能是改用java.time.LocalDateTime而不是java.util.Date/java.sql.Timestamp
  • @Turing85 似乎并非如此。我更新了 Date 和 System.currentTimeMillis 的文档。它们以 UTC 格式生成日期。所以在某处似乎日期是根据当地时区转换/调整的。

标签: java oracle


【解决方案1】:

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

请参阅Datetime Data Types 文档。

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 值执行的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-21
    • 2017-06-07
    • 2015-07-04
    • 2019-10-03
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多