将本地时间 {'09:58:00'} 转换为 UTC

问题描述 投票:0回答:1

我需要在 SQL Server 中将当地时间(10:31:00)存储为 UTC(04:31:09)。

我使用了以下查询来获得所需的结果。
我已将

@VitalReadingDate='2024-01-11'
和本地时间 (10:31:00) 结合起来以获得 UTC 时间 (04:31:09),但它返回本地时间未转换为 UTC

CONVERT(datetime2, 
    CONVERT(varchar, @VitalReadingDate) + ' ' + CONVERT(varchar, @VitalReadingTime)
) AT TIME ZONE 'UTC',
sql sql-server datetime datetime-format sql-date-functions
1个回答
1
投票

正如评论中已经提到的,如果您想在时区之间进行转换,还需要指定您当地的时区。
我知道语法看起来有点傻,但我没有编写规则 - 所以它是这样的:

select SYSDATETIME() AT TIME ZONE 'Your local time zone' AT TIME ZONE 'Target Time Zone';

要获取时区名称列表,您可以查询名为

time_zone_info
的系统表:

SELECT *
FROM sys.time_zone_info;

这会给你一个像这样的列表(非常部分):

名字 当前_UTC_偏移量 is_currently_dst
... ... ...
佛得角标准时间 -01:00 0
世界标准时间 +00:00 0
GMT 标准时间 +00:00 0
格林威治标准时间 +00:00 0
圣多美标准时间 +00:00 0
摩洛哥标准时间 +01:00 1
... ... ...

另外,根据您的代码,我假设

@VitalReadingDate
@VitalReadingTime
分别是
Date
Time
类型的变量 - 所以您应该知道有一种更好的方法将它们组合成
DateTime2
值 -即将它们转换为二进制值,组合这些值,然后将其转换为
DateTime2
:

CONVERT(DATETIME2, CONVERT(VARBINARY(6),TimeValue) + CONVERT(BINARY(3),DateValue))

请注意,这里的顺序很重要。这里的

+
运算符是连接,而不是加法,所以如果你在时间之前执行日期,你会得到一个错误:

从字符串转换日期和/或时间时转换失败。

有关详细信息,请阅读 Jeff Moden 的关于 SQLServerCentral 的在 SQL Server 中将 DATE 和 TIME 合并为 DATETIME2 文章。

对于一些人 - 这是一个完整的示例:

DECLARE @VitalReadingDate Date = '2024-01-11',
        @VitalReadingTime Time = '10:31:00';

SELECT @VitalReadingDate As DateValue
     , @VitalReadingTime As TimeValue
     , DATEADD(dd,DATEDIFF(dd,'1900',@VitalReadingDate),CONVERT(DATETIME2, @VitalReadingTime)) As LocalDateTime
     , DATEADD(dd,DATEDIFF(dd,'1900',@VitalReadingDate),CONVERT(DATETIME2, @VitalReadingTime)) 
         AT TIME ZONE 'Central Asia Standard Time' -- assumed* 
         AT TIME ZONE 'UTC' As UTC;

结果如下:

日期值 时间价值 本地日期时间 世界标准时间
2024-01-11 10:31:00.0000000 2024-01-11 10:31:00.0000000 2024-01-11 04:31:00.0000000 +00:00

*我对您当地时区的假设是基于与 UTC 的 6 小时时差

您可以在 db<>fiddle

上观看现场演示
© www.soinside.com 2019 - 2024. All rights reserved.