使 DATEDIFF() 与时钟更改兼容

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

在英国,作为夏令时的一部分,3 月最后一个星期日的凌晨 1 点时钟向前拨快一小时,2024 年是 3 月 31 日

时钟的有效滴答声如下:

2024-03-31T00:59:58
2024-03-31T00:59:59
2024-03-31T00:02:00
2024-03-31T00:02:01

有没有办法让

DATEDIFF
函数意识到这一点?

如果我这样做

SELECT DATEDIFF(MINUTE,'2024-03-31T00:59:59','2024-03-31T02:01:01')
它会返回62,而不是2

同样,如果我使用以下命令将 UTC 时间转换为本地时间:

SELECT DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()), '2024-03-31T00:59:59Z')  AS ColumnInLocalTime
SELECT DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()), '2024-03-31T02:01:01Z')  AS ColumnInLocalTime

(取自这个问题的已接受答案)

它使用 current 时间偏移量将 UTC 日期转换为本地日期,而不是我们要转换的日期时的时间偏移量

我认为解决这些问题的唯一方法是一个自定义函数,该函数以某种方式知道何时时钟发生变化?

sql-server date timezone sql-server-2019
1个回答
0
投票

简短回答

使用

AT TIME ZONE
函数为您的
DATETIME
值提供时区偏移并将其转换为
DATETIMEOFFSET
:

SELECT DATEDIFF( MINUTE, CONVERT( datetime, '2024-03-31T00:59:59') AT TIME ZONE 'GMT Standard Time',
    CONVERT( datetime, '2024-03-31T02:01:01' ) AT TIME ZONE 'GMT Standard Time' )
-- Output: 2

此函数依赖于 Windows 来进行转换。

长答案

日期和时间算术有点玄学,尤其是在处理过去的日期时。这主要是由于夏令时:不同地区有不同的规则,并且不断变化。如果您需要将时间转换为不同时区

© www.soinside.com 2019 - 2024. All rights reserved.