为什么在从时间戳中获取小时数时会得到不同的答案?

时间:2021-06-04 09:38:52

标签: sql oracle

我有以下代码

Select 
EXTRACT(HOUR FROM (FROM_TZ(CAST(SYSTIMESTAMP AS TIMESTAMP), 'UTC') at time zone 'Europe/Helsinki')) as hour,
TO_CHAR(FROM_TZ(CAST(SYSTIMESTAMP AS TIMESTAMP), 'UTC') at time zone 'Europe/Helsinki','HH24') as hour2
from dual

输出为:

HOUR    HOUR2
12       15

此函数将时间设置为 UTC,然后转换为 Europe/Helsinki,然后从时间戳中获取一个小时。为什么我在这里有不同的答案?

1 个答案:

答案 0 :(得分:3)

From the documentation

<块引用>

从具有时区值的日期时间中提取时,返回的值为 UTC。

您传入的是转换后的值,它的计算结果类似于 2021-06-04 15:14:13 EUROPE/HELSINKI;当它隐式转换回 UTC 时,它变为 2021-06-04 12:14:13 UTC,因此提取返回 12。

你的转换似乎过于复杂,而且是错误的;它不应该在您发布时给您 15,并且 12 是正确的(我认为,正如您在 UTC 时间 09:38 发布的那样),但仅仅是因为您的服务器恰好位于 +03:00 时区(我想,再次,从你看到的价值观)。

如果您想要赫尔辛基的当前时间,那么您只需使用 SYSTIMESTAMP at time zone 'Europe/Helsinki'

要将其传递到 extract() 而不将其视为 UTC,您可以在此时转换为普通时间戳:

EXTRACT(HOUR FROM CAST(SYSTIMESTAMP at time zone 'Europe/Helsinki' AS TIMESTAMP)) as hour

正确答案为 13 at the moment

db<>fiddle(英国时区的服务器,所以是 BST)