我有一个约会表,其中包含许多“资源”的约会 我需要做的是查询并返回(对于特定资源)日期范围内的所有免费预约时段。
我认为最好的方法是生成一个可能的预约时间的临时表(因为约会的长度可能是30/60/90分钟 - 将为查询指定约会长度。)和然后选择这两个记录集的交集。即所有这些 - 在整个日期范围内 - 约会表中没有约会。从而返回该资源的所有可能约会。或者只是 - 再次 - 生成可能的约会日期时间的记录,然后除了已经预订的实际约会之外......?
除非有人能提出更简单的选择。
也不完全确定如何生成可能表,即包含2010-12-08 09:00, 2010-12-08 10:00,
等记录的表格(适用于1小时约会)......
任何想法?
编辑:对可能性有一个模糊的想法...
DECLARE @startDate DateTime
DECLARE @EndDate DateTime
set @startDate = '2010-12-08 09:00'
set @endDate = '2010-12-11 09:00';
with mycte as
(
select cast(@startDate as datetime) DateValue
union all
select dateadd(mi,30,DateValue)
from mycte
where DateValue <= @endDate
and datepart(hh, dateadd(mi,30,DateValue)) Between 9 AND 16
)
select DateValue
from mycte
答案 0 :(得分:1)
这是一个典型的差距和岛屿问题。它本质上是一个常见问题,您需要在序列中识别缺失值(间隙)。幸运的是,Manning书中的SQL Server MVP Deep Dives有一个关于这个主题的免费样本章节。希望它能提供灵感,因为它为许多可能的方法提供了指导。
http://www.manning.com/nielsen/SampleChapter5.pdf
以上是Itzik Ben-Gan对问题的描述,引自上一章。
涉及到差距和岛屿问题 序列中缺少值 ......所涉及的序列也可以 是暂时的,比如订单日期,有些 由于不活跃而失踪 期间(周末,节假日)。查找 不活动期是一个例子 差距问题,找到时期 活动是一个例子 岛屿问题。