【发布时间】:2017-06-29 05:53:08
【问题描述】:
在我们的系统中,我们有一个为用户创建班次的存储过程。这些班次具有指定的开始/结束时间和持续时间。当这些转变跨越 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 日,夏令时开始,时钟向前移动一个小时。所以这段时间实际经过的小时数只有 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 时间表......所以我认为必须有更好的方法来做到这一点。社区中是否有其他人遇到过这个问题并找到了更好的方法来处理它?
【问题讨论】:
-
您是否保证永远不必确定 11 月的第一个星期日 01:30 的含义(假设上下文是美国)?当您“回退”时,您将有一个小时的重复时间,您无法根据当地时间进行排序。
-
这是个好问题。我认为我们不必担心现在是哪个 1:30。但我需要对此进行研究,以了解应用程序在该时间段内的行为方式。
-
好的,我们不需要担心这意味着什么。因为这是轮班/工作时间安排的所有逻辑。在一年中的任何一天 22:00 - 01:30 工作的人,即使在 DST 更改日期也总是只工作 3.5 小时,因为他们的轮班在 DST 02:00 转换之前结束。只有当有人跨越这个界限工作时,它才会发挥作用,因为他们要么必须额外工作一个小时,要么少工作一小时。
标签: sql-server tsql dst