SQL计算穿越夏令时边界的持续时间(以小时为单位)



在我们的系统中,我们有一个为用户创建转换的存储过程。这些轮班有指定的开始/结束时间和持续时间。当这些偏移跨越夏令时边界时,持续时间会出现错误。以以下示例为例:

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'

这将返回8小时的运行小时数。然而,在今年的3/12,夏令时开始,时钟向前移动了一个小时。因此,这段时间的实际运行时间只有7小时。我知道在SQL 2016中,我可以使用AT TIME ZONE函数来绕过这一点,但不幸的是,我必须在SQL 2008-2016中支持这一点。

我发现了另一个问题,似乎给了我一个想法:如何在SQL Server中创建夏令时开始和结束函数我可以使用这些函数来获取夏令时的开始/结束日期,然后进行一些计算,看看班次是否越过了其中一个边界,然后应用适当的偏移量,但这对我来说似乎是一个丑陋的选择。首先,并不是所有地点都遵守夏令时,也不是所有国家都使用相同的夏令时时间表。。。所以我认为必须有更好的方法来做到这一点。社区里有没有其他人遇到过这个问题,并找到了更好的方法来处理它?

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

编辑以增加清晰度:即使是SQL 2016修复程序也将依赖于人工干预和规则更新,以随着不同国家、州和城市对其夏令时法律的修改而保持最新。UTC是您可以使用的最可靠的工具。

最新更新