2010-12-08 42 views
2

我有一个约会表约会的一些'资源' 我需要做的是查询并返回(对于特定资源)所有日期范围内的免费预约插槽。tsql intersect之间的2个日期时间记录集

我以为最好的方法来处理这将是生成一个临时表的可能约会时间(因为约会的长度可能是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 

回答

1

这是一个经典的差距和岛屿问题。它基本上是一个常见问题,需要在序列中识别缺失值(缺口)。幸运的是,有关Manning书籍SQL Server MVP Deep Dives这个主题的免费样章。希望它能提供灵感,因为它为一些可能的方法提供了指导。

http://www.manning.com/nielsen/SampleChapter5.pdf

这是问题的伊茨克奔甘的描述,从上面的章引用。

差距和岛屿问题涉及 在序列 缺失值...所涉及的序列也可以是 颞,如订单日期,其中一些 丢失由于不活动 周期(周末,假期)。查找 不活动时间段是 间隙问题的一个示例,查找活动的时间段为 岛问题的示例。

+0

虐待有一个阅读,谢谢 – nat 2010-12-08 13:59:17