sql - 为什么我在从时间戳中获取小时数时会得到不同的答案?
问题描述
我有以下代码
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,然后转换为欧洲/赫尔辛基,然后从时间戳中获取一个小时。为什么我这里有不同的答案?
解决方案
从文档中:
从具有时区值的日期时间中提取时,返回的值是 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)
推荐阅读
- stored-procedures - 卸载语句在 Sybase IQ 的开始结束块内不起作用
- node.js - 使用 Mongoose 和 Node.js 将数据保存到集合中时出错
- javascript - Ditto.asByteBuffer(bytePayload) 抛出异常
- javascript - 如何在 KnockoutJs 中使用 jsPdf
- typo3 - 在扩展中包含 JS 文件
- tensorflow - 为什么tensorflow从ckpt恢复具有不同值的相同变量
- ionic-framework - 如何将base64图像转换为离子中的blob
- cmake - 如何强制 CMake 在第一个错误时失败
- graphql - 突变不起作用 GraphQL、Prisma、Yoga
- java - 在 Javax xml 转换器中禁用缓存