繁体   English   中英

UTC时区计算

[英]UTC time zone calculation

我们将时区(“澳大利亚东部标准时间”)中的数据存储到 SQL Server 数据库中,我们必须进行计算。 是否可以将两个日期都转换为 UTC 进行计算,以便计算出正确的差异?

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 CAST((@enddate - @startdate) as time(0)) 'Difference'

Time difference: 12:55:00

Actual Time Difference: 11:55:00

正如@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将在不明确的时间间隔内返回更改前的偏移量。

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

使用 DATETIME2 instaed(MS 推荐)

然后用操作符 AT TIME ZONE 设置 TIMEZONE:

使用 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM