【问题标题】:MySQL Check if time range falls outside of given time slots for dayMySQL检查时间范围是否超出一天的给定时间段
【发布时间】:2018-02-28 20:43:51
【问题描述】:

假设我有一个预订表:

id|booking_ref|start_datetime      |end_datetime
-------------------------------------------------------
01|ABC        |2018-01-01 09:30:00 |2018-01-01 10:00:00
02|DEF        |2018-01-01 11:00:00 |2018-01-01 12:00:00
03|GHI        |2018-01-01 13:00:00 |2018-01-01 13:15:00

如果我提供允许进行这些预订的给定时间段,我将如何检查是否有任何预订属于不允许预订的时间段?

例如允许的时隙来自:

2018-01-01 09:00:00 to 2018-01-01 10:30:00
2018-01-01 11:00:00 to 2018-01-01 13:30:00
2018-01-01 14:00:00 to 2018-01-01 17:00:00

示例表中的所有预订都在允许的时间段之间。

您将如何编写查询来检查给定日期是否有任何不属于任何允许时间段的预订?

我尝试了通常的start_datetime >=end_datetime <= 等,但无法弄清楚。

【问题讨论】:

标签: php mysql date datetime date-range


【解决方案1】:
select * from bookings b
where exists (
    select 1 from disallowed d
    where b.start <= d.end and d.start <= b.end
);

也可以对这些值进行硬编码:

select * from bookings b
where b.start1 <= '2018-01-01 10:30:00' and '2018-01-01 09:00:00' <= b.end1
   or b.start1 <= '2018-01-01 10:30:00' and '2018-01-01 11:00:00' <= b.end1
   or b.start1 <= '2018-01-01 17:00:00' and '2018-01-01 14:00:00' <= b.end1;

【讨论】:

  • 我不太确定不允许的表来自哪里。我能找到的所有范围示例都假定您有两次给定的时间。在原始帖子中,2018-01-01 有三个时间段。
【解决方案2】:

想通了,此查询将查找部分或全部超出给定范围的任何日期范围。最后硬编码。

SELECT
  *
FROM
  mi_bookings b
WHERE NOT (
    (b.start_datetime BETWEEN '2018-01-01 09:00:00' AND '2018-01-01 10:30:00') AND (b.end_datetime BETWEEN '2018-01-01 09:00:00' AND '2018-01-01 10:30:00')     
  OR 
    (b.start_datetime BETWEEN '2018-01-01 11:00:00' AND '2018-02-05 13:30:00') AND (b.end_datetime BETWEEN '2018-01-01 11:00:00' AND '2018-01-01 13:30:00')
  OR 
    (b.start_datetime BETWEEN '2018-01-01 14:00:00' AND '2018-01-01 17:00:00') AND (b.end_datetime BETWEEN '2018-01-01 14:00:00' AND '2018-01-01 17:00:00')
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多