繁体   English   中英

使用SQL查找可用的时隙

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM