Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用SQL查找可用的时间段_Php_Mysql_Sql - Fatal编程技术网

Php 使用SQL查找可用的时间段

Php 使用SQL查找可用的时间段,php,mysql,sql,Php,Mysql,Sql,我在这里找到了一个关于在数据库中查找可用时间段的常见问题的答案。查询的工作方式就像一个符咒,但是如果我添加了一个新事件,并且该事件在alredy添加的事件之前开始,那么查询就会失败。在这种情况下,输出的顺序是错误的。答案中有一个例子,我刚刚在模式中添加了新行: insert into bookingEvents values (null, '2013-05-12 05:11:00', 15); 正如您所看到的,事件的日期早于上次插入的事件的日期,它们不再按时间顺序排列。也许我试图在一个查询中加

我在这里找到了一个关于在数据库中查找可用时间段的常见问题的答案。查询的工作方式就像一个符咒,但是如果我添加了一个新事件,并且该事件在alredy添加的事件之前开始,那么查询就会失败。在这种情况下,输出的顺序是错误的。答案中有一个例子,我刚刚在模式中添加了新行:

insert into bookingEvents values (null, '2013-05-12 05:11:00', 15);
正如您所看到的,事件的日期早于上次插入的事件的日期,它们不再按时间顺序排列。也许我试图在一个查询中加入太多的逻辑,如果是这样的话,那么我如何用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); 

显然,你可以在没有视图的情况下重写它-我只是发现很难读取所有这些+间隔位

抱歉,这是一个输入错误jsFiddle->sqlFiddle:D不管怎样,只要看看我编辑的fiddle的输出,你就会发现前两行显然是错误的,因为时间间隔2013-05-10 00:00:00-2013-05-13 13 13:22:00并不都是免费的,我的问题在里面。谢谢你的回复,我感谢你的帮助。但是,您的查询不适用于重叠的时间跨度。你能帮我解决它吗?还有一个小问题:如果事件有一个user_id属性,我需要过滤用户的空闲槽,我应该只在视图中放置WHERE条件吗?我想你可以,但这似乎有点乏味。但是,如果我们要继续使用视图,并且记住它所做的只是将持续时间添加到starttime,那么我会修改它,使其也包含所有用户id信息,然后修改查询以利用该信息。See fiddle我不需要这个视图,因为我编辑了我的表,现在我有了开始日期和结束日期,而不是持续时间列。也许讨论的时间太长了,我想在优化这个查询方面得到更多的帮助,但也许这不是合适的地方,如果你有时间,我们应该在聊天室里谈谈。我认为更好的办法是问一个关于查询优化的新问题,而不是我的强项,然后再参考这个帖子。