UTC时区计算

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

如何进行时区转换

sql-server utc
2个回答
2
投票

正如 @Larnu 在评论中建议的那样,如果没有偏移量,日期时间值将会出现问题。当时钟调回并导致时间更改前后时间重叠时,就会发生这种情况。在这种情况下,您需要规则来确定偏移量。

在您的示例中,时钟向前设置,不应该有重叠或模糊。这允许使用

AT DATE TIME AUS Eastern Standard Time')
将日期时间值转换为 datetimeoffset 以进行持续时间计算。如果存储了无效的日期时间值(在时钟应向前更改的间隙内),
AT DATE TIME
将返回时钟更改后的偏移量。

DECLARE @startdate DateTime = '2022-10-01 23:13:00.000'; --UTC 2022-10-01 13:13:00.00
DECLARE @enddate DateTime   = '2022-10-02 12:08:00.000';  --UTC 2022-10-02 01:08:00.00
SELECT DATEADD(second
        , DATEDIFF(second, @startdate AT TIME ZONE 'AUS Eastern Standard Time'
        , @enddate AT TIME ZONE 'AUS Eastern Standard Time')
    , CAST('00:00:00' AS time(0)));

因此,您一年中将有一小时需要为其制定业务规则。

AT DATE TIME
当时钟向后设置时,将返回模糊间隔期间更改之前的偏移量


1
投票

不推荐使用 DATETIME,因为它是一种具有大量错误功能的数据类型,而且不准确。

使用DATETIME2代替(MS推荐)

然后与操作员一起设置时区 AT TIME ZONE :

使用 ALSO DATETDIFF 获得差异,因为减号必须仅适用于数字,不适用于日期/时间演算...

最后:

DECLARE @startdate DateTime2 = '2022-10-01 23:13:00.000'; 
DECLARE @enddate DateTime2 = '2022-10-02 12:08:00.000'; 
DECLARE @difsecond INT = DATEDIFF(s, @startdate AT TIME ZONE 'AUS Eastern Standard Time', @enddate AT TIME ZONE 'AUS Eastern Standard Time')  
SELECT CAST(DATEADD(s, @difsecond, CAST('2000-01-01' AS DATETIME2(0))) AS TIME)
© www.soinside.com 2019 - 2024. All rights reserved.