【问题标题】:MySQL query to find available slots between two timeMySQL查询以查找两次之间的可用插槽
【发布时间】:2019-01-03 18:10:42
【问题描述】:

我有一个叫预定会议的表,下面是表结构

会议桌

id | meeting_name | from_time  | to_time | date

结构如下

CREATE TABLE `bookings` (
  `id` int(11) NOT NULL,
  `meeting_name` varchar(255) DEFAULT NULL,
  `from_time` time DEFAULT NULL,
  `to_time` time DEFAULT NULL,
  `date` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;



INSERT INTO `bookings` (`id`, `meeting_name`, `from_time`, `to_time`, `date`) VALUES(
(1, 'meeting1', '09:00:00', '10:30:00', '2018-07-26'),
(2, 'meeting2', '11:40:00', '12:25:00', '2018-07-26');
(3, 'meeting3', '03:40:00', '04:25:00', '2018-07-26'););

在这里我试图在两次之间找到可用的插槽假设如果我输入from time 作为10:00:00to time 作为01:00:00 那么它应该返回这段时间之间的所有会议并且需要找出可用的时间他们之间

我是 mysql 新手,所以尝试了几个查询,但没有得到预期的结果

SELECT * 
FROM `bookings` 
WHERE bookings.from_time>="10:00:00" and bookings.to_time<="01:00:00"


SELECT * 
FROM `bookings` 
WHERE bookings.from_time>="10:00:00" or
    bookings.to_time<="10:00:00" or
    bookings.from_time>="01:00:00" or
    bookings.to_time<="01:00:00"

预期结果 如果我在 10:00:00.00 到 13:00:00 之间度过时间,那么它应该返回

还有可用的插槽,例如

10:31:00 to 11:39:00
12.26 to 03:49:00

【问题讨论】:

  • 您想要两次之间的会议列表,还是您的问题建议的可用空闲时间?
  • 另外,为什么不将开始/结束时间存储为时间戳或日期/时间?时间是 24 小时制还是 12 小时制?
  • @SloanThrasher。我需要两个时间之间预订的会议列表。如果有任何空位可用,那么我需要显示可用时间来预订
  • @SloanThrasher.if 这使得结果我可以。我是 mysql 的新手,所以这样做了。表中的任何帮助和更正都是可以接受的。谢谢
  • 第一个很简单,你可以简单地使用 BETWEEN。第二个不是那么简单,而是一个单独的查询。

标签: mysql sql


【解决方案1】:

要在定义的时间段(从 10:00 到 13:00)内找到至少有部分时间的所有会议,您应该这样做

SELECT * 
FROM `bookings` 
WHERE bookings.from_time<="13:00:00" -- end of time slot
AND   bookings.to_time>=  "10:00:00" -- start of time slot

我希望我能正确理解关于结束时间的问题。我更喜欢使用 24h 表示法。为了完整起见,您还应该检查date 值是否与调查的时间段相同。

在这里试用小演示:http://rextester.com/LNUD45826

【讨论】:

    【解决方案2】:

    首先,我使用的是 24 小时制,你也应该这样做。

    您的数据又增加了一天,以表明该查询将包含同一天会议之间的间隔:

    CREATE TABLE `bookings` (
      `id` int(11) NOT NULL,
      `meeting_name` varchar(255) DEFAULT NULL,
      `from_time` time DEFAULT NULL,
      `to_time` time DEFAULT NULL,
      `date` date DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    INSERT INTO `bookings` (`id`, `meeting_name`, `from_time`, `to_time`, `date`) VALUES
    (1, 'meeting1', '09:00:00', '10:30:00', '2018-07-25'),
    (2, 'meeting2', '11:40:00', '12:25:00', '2018-07-25'),
    (3, 'meeting3', '03:40:00', '04:25:00', '2018-07-25'),
    (1, 'meeting4', '09:00:00', '10:30:00', '2018-07-26'),
    (2, 'meeting5', '11:40:00', '12:25:00', '2018-07-26'),
    (3, 'meeting6', '03:40:00', '04:25:00', '2018-07-26');
    

    这是你的查询,在 SQL Server 中实现LAG 函数很容易,这里我们必须模仿它(here's how to do it - 它会帮助你理解查询)

    select @start := cast('10:00:00' as time), @end := cast('13:00:00' as time),
           @time := cast(null as time), @date := cast(null as date);
    
    select date, to_time_lag, from_time, gap_between_meetings from (
      select id,
             meeting_name,
             from_time,
             @time to_time_lag,
             to_time,
             @date date_lag,
             case when @date = date then timediff(from_time, @time) end gap_between_meetings,
             @time := to_time,
             date,
             @date := date
      from bookings
      where from_time between @start and @end
         or to_time between @start and @end
      order by date, from_time
    ) a where gap_between_meetings is not null
    

    【讨论】:

    • 这很好,但我认为你可以走得更远。日期和时间应存储为单个实体
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 2014-01-28
    • 2020-11-23
    • 2012-12-13
    相关资源
    最近更新 更多