尝试在 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(和本地时间戳)。
一些一般注意事项:
SYSTIMESTAMP
和 SYSDATE
以数据库服务器操作系统的时区给出。因此,更改数据库时区(即 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')
执行以下操作:
- 获取数据库服务器操作系统时区的当前时间,包括时区信息。
- 把这个时间转换成UTC,截取时区信息
- 将时区信息 (
+00:00
) 添加到此值
Correct output but redundant conversion
cast(sysdate as timestamp) at time zone 'UTC'
执行以下操作:
- 获取数据库服务器操作系统时区的当前时间,不带任何时区信息。
- Cast to TIMESTAMP(基本没有任何影响)
- 将此值视为本地会话时区 (
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')
执行以下操作:
- 获取数据库服务器操作系统时区的当前时间,包括时区信息。
- 将这个时间转换为 UTC
- 剪切时区信息
- 将时区信息 (
+00:00
) 添加到此值
Correct output but redundant conversion
from_tz(cast(systimestamp as timestamp), '+0:00')
执行以下操作:
- 获取数据库服务器操作系统时区的当前时间,包括时区信息。
- 剪切时区信息
- 将时区信息 (
+00:00
) 添加到此值
Correct output only if time zone of your database server's operating system is UTC.
使用以下查询从 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(和本地时间戳)。
一些一般注意事项:
SYSTIMESTAMP
和 SYSDATE
以数据库服务器操作系统的时区给出。因此,更改数据库时区(即 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')
执行以下操作:
- 获取数据库服务器操作系统时区的当前时间,包括时区信息。
- 把这个时间转换成UTC,截取时区信息
- 将时区信息 (
+00:00
) 添加到此值
Correct output but redundant conversion
cast(sysdate as timestamp) at time zone 'UTC'
执行以下操作:
- 获取数据库服务器操作系统时区的当前时间,不带任何时区信息。
- Cast to TIMESTAMP(基本没有任何影响)
- 将此值视为本地会话时区 (
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')
执行以下操作:
- 获取数据库服务器操作系统时区的当前时间,包括时区信息。
- 将这个时间转换为 UTC
- 剪切时区信息
- 将时区信息 (
+00:00
) 添加到此值
Correct output but redundant conversion
from_tz(cast(systimestamp as timestamp), '+0:00')
执行以下操作:
- 获取数据库服务器操作系统时区的当前时间,包括时区信息。
- 剪切时区信息
- 将时区信息 (
+00:00
) 添加到此值
Correct output only if time zone of your database server's operating system is UTC.