首页 > 解决方案 > 为什么我在从时间戳中获取小时数时会得到不同的答案?

问题描述

我有以下代码

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,然后转换为欧洲/赫尔辛基,然后从时间戳中获取一个小时。为什么我这里有不同的答案?

标签: sqloracle

解决方案


从文档中

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

您正在传递转换后的值,该值将评估为2021-06-04 15:14:13 EUROPE/HELSINKI; 当它被隐式转换回 UTC 时,它变为2021-06-04 12:14:13 UTC,因此 extract 返回 12。

您的转换似乎过于复杂且错误;它不应该在您发布时给您 15,并且 12 是正确的(我认为,正如您在 09:38 UTC 发布的那样),但这只是因为您的服务器恰好位于 +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 。

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


推荐阅读