有一个问题,询问如何查找多个日期范围中有多少分钟,忽略重叠.
给出的示例数据是(userID不是特别相关)
--Available--
ID userID availStart availEnd
1 456 '2012-11-19 16:00' '2012-11-19 17:00'
2 456 '2012-11-19 16:00' '2012-11-19 16:50'
3 456 '2012-11-19 18:00' '2012-11-19 18:30'
4 456 '2012-11-19 17:30' '2012-11-19 18:10'
5 456 '2012-11-19 16:00' '2012-11-19 17:10'
6 456 '2012-11-19 16:00' '2012-11-19 16:50'
Run Code Online (Sandbox Code Playgroud)
我可以使用游标解决问题,但我认为它应该适应CTE,但我无法弄清楚如何做到这一点.
方法是按开始时间排列每个范围然后我们构建一个按顺序合并范围的范围,直到我们找到一个不与我们的合并范围重叠的范围.然后我们计算合并范围内的分钟数,并记住这个我们继续下一个范围,再次合并任何重叠.我们每次得到一个非重叠的起始点时累积分钟.最后,我们将累积的分钟数加到最后一个范围的长度上
很容易看出,由于订单的原因,一旦范围与之前的范围不同,那么没有其他范围可能与以前的范围重叠,因为它们的开始日期都更大.
Declare
@UserID int = 456,
@CurStart datetime, -- our current coalesced range start
@CurEnd datetime, -- our current coalesced range end
@AvailStart datetime, -- start or range for our next row of …Run Code Online (Sandbox Code Playgroud)