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