您必须首先以某种方式创建所有时隙,以便您拥有可以检查预订的东西。递归CTE
最适合这样的事情。因此,使用可以使用这个CTE
:
DECLARE @MinStart TIME = '10:00:00'
DECLARE @MaxEnd TIME = '12:00:00'
;WITH Timeslots AS (
SELECT SlotStart = @MinStart,
SlotEnd = DATEADD(MINUTE, 30, @MinStart)
UNION ALL
SELECT SlotStart = DATEADD(MINUTE, 30, SlotStart),
SlotEnd = DATEADD(MINUTE, 30, SlotEnd)
FROM Timeslots
WHERE SlotEnd < @MaxEnd
)
SELECT *
FROM Timeslots
生成下表表达式:
SlotStart SlotEnd
------------------------------------
10:00:00.0000000 10:30:00.0000000
10:30:00.0000000 11:00:00.0000000
11:00:00.0000000 11:30:00.0000000
11:30:00.0000000 12:00:00.0000000
10:00
这些都是和之间的时隙12:00
。
您现在可以使用此查询:
;WITH Timeslots AS (
... cte statement here ...
)
SELECT fk, COUNT(fk) AS occurrences, t.SlotStart, t.SlotEnd
FROM #Reservations AS r
INNER JOIN Timeslots AS t ON t.SlotStart >= r.start AND t.SlotEnd <= r.[end]
GROUP BY fk, t.SlotStart, t.SlotEnd
得到你想要的结果:
fk occurrences SlotStart SlotEnd
---------------------------------------------
1 1 10:00:00.0000000 10:30:00.0000000
1 2 10:30:00.0000000 11:00:00.0000000
1 1 11:00:00.0000000 11:30:00.0000000
2 1 10:00:00.0000000 10:30:00.0000000
2 1 10:30:00.0000000 11:00:00.0000000