我有以下代码
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,然后从时间戳中获取一个小时。为什么我在这里有不同的答案?
答案 0 :(得分:3)
从具有时区值的日期时间中提取时,返回的值为 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)