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

时间:2017-02-10 19:07:28

标签: sql-server tsql dst

在我们的系统中,我们有一个存储过程,可以为用户创建班次。这些班次具有指定的开始/结束时间和持续时间。当这些变化越过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'

这将返回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开始/结束日期然后进行一些计算以查看移位是否越过这些边界之一,然后应用适当的偏移但这对我来说似乎是一个丑陋的选择。首先,并非所有地点都遵守DST,并非所有国家都使用相同的DST时间表......所以我认为必须有更好的方法来实现这一目标。社区中的其他人是否遇到过这个问题并找到了更好的方法来处理它?<​​/ p>

1 个答案:

答案 0 :(得分:3)

由于您在不同地点的DST时间表中发现了不确定性,因此通常建议以UTC格式进行所有日期时间计算,并在当地时间为客户显示。 DST规则可以随时根据当地法律进行更改,甚至从城市到城市,UTC是目前计算时间的最佳方式。

进一步明确编辑:即使SQL 2016修复程序依赖于人工干预和规则更新,因为不同的国家/地区,州和城市会更改其DST法律,因此需要保持最新状态。 UTC是您可以随意使用的最佳可靠工具。