SQL 计算跨越 DST 边界的持续时间(以小时为单位)

SQL Calculate duration of time in hours crossing DST boundaries

在我们的系统中,我们有一个为用户创建班次的存储过程。这些班次有指定的 start/end 时间和持续时间。当这些班次跨越 DST 边界时,持续时间不正确。举个例子:

declare @start DATETIME = '2017-03-11 22:00:00.000',
@end DATETIME = '2017-03-12 06:00:00.000'
select (DATEDIFF(hh, @start, @end)) as 'Elapsed Hours'

这 returns 已过去 8 小时。然而,今年 3 月 12 日,DST 开始,时钟向前移动一个小时。所以这个时间段的实际经过时间只有 7。我知道在 SQL 2016 年我可以使用 AT TIME ZONE 函数来解决这个问题,但不幸的是我必须在 SQL 中支持这个] 2008 - 2016.

我发现另一个问题似乎给了我一个想法: How to create Daylight Savings time Start and End function in SQL Server 我可以使用这些函数来获取 DST start/end 日期,然后进行一些计算以查看班次是否跨越这些边界之一,然后应用适当的偏移量,但这对我来说似乎是一个丑陋的选择。首先,并非所有地点都遵守夏令时,也并非所有国家/地区都使用相同的夏令时时间表......所以我认为必须有更好的方法来做到这一点。社区中是否有其他人 运行 遇到过这个问题并找到了更好的处理方法?

由于您在不同地点的 DST 时间表中发现了不确定性,通常建议使用 UTC 进行所有日期时间计算,并以本地时间显示给客户。 DST 规则可以根据当地法律随时更改,即使在不同城市之间也是如此,UTC 是迄今为止计算时间的最佳方式。

为了更加清晰而进行编辑:即使是 SQL 2016 年的修复也将依赖于人为干预和规则更新,以便在不同的国家、州和城市对其 DST 法律进行更改时保持最新。 UTC 是您可以使用的最可靠的工具。