[英]Find available time slots with SQL
我在SO上找到关于在数据库中找到可用时隙的常见问题的答案 。 该查询的工作原理像一个超级按钮,但是如果我添加一个新事件(在添加事件之前开始),它将开始失败。 在这种情况下,输出顺序是错误的。 答案中有一个sqlFiddle示例,我刚刚在模式中添加了新行:
insert into bookingEvents values (null, '2013-05-12 05:11:00', 15);
如您所见,事件的日期早于上一个先前插入的事件的日期(按照timeBooked的顺序,它们不再是按顺序排列 )。 也许我正在尝试在查询中添加过多的逻辑,如果是这样的话,那么我也该如何使用PHP处理这个问题?
编辑
可能我应该首先展平时间戳,然后对结果执行查询。 我找到了一些可以使时间戳变平的东西 ,但是我需要帮助合并两个查询并获得针对生产进行优化的东西
为了保持理智,我创建了如下视图:
CREATE VIEW v_bookingevents AS
SELECT id
, timebooked startdate
, timebooked + INTERVAL duration MINUTE enddate
FROM bookingevents
ORDER
BY startdate;
然后...
SELECT a.enddate 'Available From'
, MIN(b.startdate) 'To'
FROM
(
SELECT DISTINCT
COALESCE(LEAST(x.startdate,y.startdate),x.startdate) startdate
, COALESCE(GREATEST(x.enddate,y.enddate),x.enddate) enddate
FROM v_bookingevents x
LEFT
JOIN v_bookingevents y
ON y.id <> x.id
AND y.startdate < x.enddate
AND y.enddate > x.startdate
UNION
SELECT '2013-05-12 00:00:00'
, '2013-05-12 00:00:01'
) a
JOIN
(
SELECT DISTINCT
COALESCE(LEAST(x.startdate,y.startdate),x.startdate) startdate
, COALESCE(GREATEST(x.enddate,y.enddate),x.enddate) enddate
FROM v_bookingevents x
LEFT
JOIN v_bookingevents y
ON y.id <> x.id
AND y.startdate < x.enddate
AND y.enddate > x.startdate
UNION
SELECT '2013-05-15 00:00:00'
,'2013-05-15 00:00:01'
) b
ON b.startdate > a.enddate
GROUP
BY a.enddate
HAVING a.enddate < MIN(b.startdate);
http://sqlfiddle.com/#!2/e67b47/1
显然,您可以在没有视图的情况下重写它-我只是发现很难读取所有这些“ + INTERVAL”位。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.