[英]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.