【问题标题】:Find free timings查找免费时间
【发布时间】:2014-04-29 13:22:48
【问题描述】:

这是数据库架构:

   CREATE TABLE `bookings` (
      `id` int(2) NOT NULL,
      `start` time NOT NULL,
      `end` time NOT NULL
    );

    INSERT INTO `bookings` VALUES(1, '13:00:00', '14:30:00');
    INSERT INTO `bookings` VALUES(2, '15:00:00', '16:00:00');

我尝试运行以下查询,以查找“10:00:00”和“18:00:00”之间的空闲时间:

SELECT free_from, free_until
FROM (SELECT a.end AS free_from,
             (SELECT MIN(c.start)
              FROM bookings c
              WHERE c.start>a.end
             ) as free_until
      FROM bookings a
      WHERE NOT EXISTS (SELECT 1
                        FROM bookings b
                        WHERE b.start BETWEEN a.end AND a.end + 1
                       ) AND
            a.end BETWEEN '10:00:00' AND '18:00:00'
     ) t

生成的输出是:

free_from   free_until
14:30:00    15:00:00
16:00:00    NULL

为什么最后会有一个NULL?请帮我解决这个问题。预期输出应该是:

free_from   free_until
10:00:00    13:00:00
14:30:00    15:00:00
16:00:00    18:00:00

【问题讨论】:

    标签: mysql sql database phpmyadmin


    【解决方案1】:

    想一想……

    SELECT NULL id,NULL start, '09:59:59' end
    UNION
    SELECT * FROM bookings
    UNION
    SELECT NULL,'18:00:01',NULL;
    +------+----------+----------+
    | id   | start    | end      |
    +------+----------+----------+
    | NULL | NULL     | 09:59:59 |
    |    1 | 13:00:00 | 14:30:00 |
    |    2 | 15:00:00 | 16:00:00 |
    | NULL | 18:00:01 | NULL     |
    +------+----------+----------+
    

    【讨论】:

    • 这里的输出是开始和结束时间。但是我需要空闲时间,如预期输出所示
    • 好吧,你在这个答案中拥有你需要知道的一切。如果您仍然不清楚,您的解决方案中有null,因为您无法选择不存在的内容。因此,您必须创建它。赞成“教鱼”而不是“喂”的态度:)
    猜你喜欢
    • 2020-08-03
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 2010-11-02
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多