尝试在 Oracle 中检索 UTC 时间戳,使用 "from_tz" 会导致问题吗?

Trying to retrieve the UTC time-stamp in Oracle, does using "from_tz" cause an issue?

使用以下查询从 Oracle 数据库检索 UTC 时间戳会导致问题吗?我不想更改数据库时区参数以检索正确的日期。我不想做 alter database set time_zone.

我现在的查询是:

select from_tz(CAST (sys_extract_utc(systimestamp) AS TIMESTAMP), '+00:00') from dual;

我想知道无论 EST/EDT 状态如何,此查询在所有情况下是否都会产生正确的 UTC 日期。

您的查询只是设置时区,没有转换时间。如果这就是您要找的东西,那没关系。如果当地时间是凌晨 3 点,您将 return 凌晨 3 点 UTC。 我认为您正在寻找该查询:

select cast(sysdate as timestamp) at time zone 'UTC' from dual;

并应用

select from_tz(cast(systimestamp at time zone 'UTC' as timestamp), '+0:00') from dual;

我没有发现您的查询有任何问题。请注意,如果你想在你的会话中使用 UTC,你可以简单地:

ALTER SESSION SET TIME_ZONE = '0:00';
select CURRENT_TIMESTAMP from dual;

输出

11/1/2016 5:48:55.115282 PM +00:00

这会改变整个会话的 current_timestamp(和本地时间戳)。

一些一般注意事项:

SYSTIMESTAMPSYSDATE 以数据库服务器操作系统的时区给出。因此,更改数据库时区(即 DBTIMEZONE)不会改变任何内容。

CAST (sys_extract_utc(systimestamp) AS TIMESTAMP),分别。 cast(systimestamp at time zone 'UTC' as timestamp) 有问题。您将时间戳转换为 UTC,但是 CAST(... AS TIMESTAMP) 您从该值中删除了任何时区信息。如果您想进行任何进一步的转换(例如再次转换为 TIMESTAMP WITH TIME ZONE 值),那么您输入的 UTC 值将被视为 SESSIONTIMEZONE 值。

from_tz(CAST (sys_extract_utc(systimestamp) AS TIMESTAMP), '+00:00') 执行以下操作:

  1. 获取数据库服务器操作系统时区的当前时间,包括时区信息。
  2. 把这个时间转换成UTC,截取时区信息
  3. 将时区信息 (+00:00) 添加到此值

Correct output but redundant conversion

cast(sysdate as timestamp) at time zone 'UTC' 执行以下操作:

  1. 获取数据库服务器操作系统时区的当前时间,不带任何时区信息。
  2. Cast to TIMESTAMP(基本没有任何影响)
  3. 将此值视为本地会话时区 (SESSIONTIMEZONE) 中的时间并转换为 UTC。

Correct output only if time zone of your database server's operating system is the same as your local session time zone, otherwise you get wrong result.

from_tz(cast(systimestamp at time zone 'UTC' as timestamp), '+0:00') 执行以下操作:

  1. 获取数据库服务器操作系统时区的当前时间,包括时区信息。
  2. 将这个时间转换为 UTC
  3. 剪切时区信息
  4. 将时区信息 (+00:00) 添加到此值

Correct output but redundant conversion

from_tz(cast(systimestamp as timestamp), '+0:00') 执行以下操作:

  1. 获取数据库服务器操作系统时区的当前时间,包括时区信息。
  2. 剪切时区信息
  3. 将时区信息 (+00:00) 添加到此值

Correct output only if time zone of your database server's operating system is UTC.