这是一个很好的地方使用一个虚拟整数表,它可以帮助你create data from nothing。这里有一个例子:
create table ints(i tinyint);
insert into ints values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
然后,您可以使用此表中的一些交叉连接产生的由您SCHEDULED_TIME表来表示长达一小时的窗口表,并留下连接的结果对任命表中查找窗口没有已经预定的东西。
SELECT
h.HourWindowStart, h.HourWindowEnd
FROM (
SELECT
s.start + INTERVAL t.i*100 + u.i*10 + v.i HOUR AS HourWindowStart,
s.start + INTERVAL t.i*100 + u.i*10 + v.i + 1 HOUR AS HourWindowEnd
FROM scheduled_time s
JOIN ints AS t
JOIN ints AS u
JOIN ints AS v
WHERE s.start + INTERVAL t.i*100 + u.i*10 + v.i HOUR < s.end
ORDER BY HourWindowStart
) as h
LEFT JOIN appointments a ON a.end > h.HourWindowStart AND a.start < h.HourWindowEnd
WHERE a.start IS NULL
可以调整此处理,以计算更大/更小的可用性窗口的各个部分(由半小时,按天,等等),使用基于的最大数目更多或更少的交叉连接的整数表的的可用性窗口,可以在scheduled_time的单个开始/结束范围内表示,预先创建日期日历并加入两个表格等。
我今晚要回答这个问题,如果没有人回答你然后 – 2010-11-09 16:58:59
我很好奇,知道是否有一个“简单”的方法来做到这一点... – 2010-11-09 17:02:41