gpt4 book ai didi

sql - 如何假设 DATETIME 位于我的本地时区,然后转换为 UTC

转载 作者:行者123 更新时间:2023-12-02 09:07:54 26 4
gpt4 key购买 nike

使用 SQL Server 2016,我有一个 DATETIME 类型的 date_time 列,该列是使用计算机的本地时区插入的。我需要将此值转换为 UTC。

我尝试使用

CONVERT(NVARCHAR(19), date_time AT TIME ZONE 'UTC', 127) + 'Z' AS Timestamp

但我现在意识到它会自动假定 date_time 已经是 UTC 时间,因此不会进行任何转换。我没有使用 DATEADD 因为它不考虑 DST。

有没有办法告诉 SQL Server 日期时间位于计算机的本地时区,然后使用 AT TIME ZONE 将其转换为 UTC?

编辑:这不是重复的,因为批准的答案中的评论(“是的,但它假设输入时间是 UTC,如果您想从本地时间转换为 UTC,这是毫无意义的”)说明了问题我已经在这个问题中概述了。

最佳答案

AT TIME ZONE 是等式的一半。另一个是获取机器的时区,即使是 2017 年也没有实际的功能或 SERVERPROPERTY ,您需要在注册表中查找。从 SQL Server 2019 开始(和 Azure SQL),有 CURRENT_TIMEZONE() function ,但是(在看似奇怪的疏忽中)它的返回值不能用作 AT TIME ZONE 子句的输入或与 sys.time_zone_info 相关,所以它不是明确它的用途。

DECLARE @TimeZone NVARCHAR(4000);
EXEC master.dbo.xp_regread
'HKEY_LOCAL_MACHINE',
'SYSTEM\CurrentControlSet\Control\TimeZoneInformation',
'TimeZoneKeyName',
@TimeZone OUT;

-- For me, that's 'W. Europe Standard Time'

SELECT {ts '2019-03-31 02:00:00' } AT TIME ZONE @TimeZone AT TIME ZONE 'UTC'
-- Yields '2019-03-31 01:00:00.000 +00:00', DST was not in effect

SELECT {ts '2019-03-31 03:00:00' } AT TIME ZONE @TimeZone AT TIME ZONE 'UTC'
-- *Also* yields '2019-03-31 01:00:00.000 +00:00', DST was in effect

这些示例说明了必须转换未使用实际偏移记录的时间戳的危险:在 DST 周转的“暮光区”中,您得到的时间本质上是不明确的。这种调整的结果只是大部分是正确的,每年两次跳过和重复一个小时。有些数据集可以接受,有些则不能。

关于sql - 如何假设 DATETIME 位于我的本地时区,然后转换为 UTC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55849975/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com