在英国,作为夏令时的一部分,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 日期转换为本地日期,而不是我们要转换的日期时的时间偏移量
我认为解决这些问题的唯一方法是一个自定义函数,该函数以某种方式知道何时时钟发生变化?
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 来进行转换。
日期和时间算术有点玄学,尤其是在处理过去的日期时。这主要是由于夏令时:不同地区有不同的规则,并且不断变化。如果您需要将时间转换为不同时区