我有一个约会表,其中有许多“资源”的约会,我需要做的就是查询并在日期范围内返回(特定资源)所有免费约会插槽。

我曾经认为最好的方法是生成一个可能的约会时间的临时表(因为约会的长度可能为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
有帮助吗?

解决方案

这是一个经典的差距和岛屿问题。本质上,这是一个常见的问题,您需要在序列中识别缺失值(差距)。幸运的是,从曼宁书SQL Server MVP Deep Dives中提供了有关此主题的免费示例章节。希望它将提供灵感,因为它为许多可能的方法提供指导。

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

这是上一章引用的Itzik Ben-Gan对问题的描述。

差距和岛屿问题涉及序列中的缺失值……所涉及的序列也可能是时间的,例如订单日期,其中一些由于不活动时(周末,节日)而缺少。寻找无活动的时期是差距问题的一个例子,而寻找活动期是岛屿问题的一个例子。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top