【问题标题】:Need to see if a range of dates overlaps another range of dates in sql需要查看一个日期范围是否与sql中的另一个日期范围重叠
【发布时间】:2011-07-02 19:09:11
【问题描述】:

我有一个存储房间预订的表,架构是:

ID | ROOM_ID | CHECK_IN_DATE | CHECK_OUT_DATE | USER_ID

我需要对一组日期范围内可用/不可用的房间进行搜索查询。

另外请记住,存在另一个表格,其中包含预订房间的日期及其格式:

ROOM_ID | DATE

所以我需要运行一个查询来查找设定范围内的可用房间,我将如何制定查询? 我这里用的是 MySQL。

---编辑---

还有一个Rooms 表:

ID | ROOM DETAILS etc

不可用/预定日期表基本上是零星的单个日期,不可用表中的每个日期都是指由于某种原因无法预订房间的日期,例如:维护等

【问题讨论】:

  • prebooked table的意思不清楚。 DATE 字段的含义是什么?应用什么范围?
  • 此外,此表结构假定房间不存在,除非它们已被预先预订或预订。有没有房间桌?

标签: php mysql sql-optimization


【解决方案1】:

有 5 种可能的方法:

---s-----e---

s-e----------
--s-e--------
-----s-e-e---
--------s-e--
----------s-e

s = start / e=end firste line 是您的数据库集,其他是可能的搜索

只有第一个和最后一个是您想要的,所以您要寻找的是: search.end entry.end

【讨论】:

    【解决方案2】:
    SELECT
       ROOM_ID
    FROM
       Rooms r
       LEFT JOIN Bookings b ON (
          r.ROOM_ID = b.ROOM_ID
          AND b.CHECK_IN_DATE > '$MAX_DATE'
          AND b.CHECK_OUT_DATE < '$MIN_DATE'
       )
    

    由于没有日期范围,我不确定预订房间的因素。预订房间是否也能获得预订条目?

    【讨论】:

      【解决方案3】:
      SELECT id FROM rooms WHERE id NOT IN (
         SELECT room_id FROM bookings 
         WHERE check_in_date < 'end date' AND check_out_date > 'start date'
      );
      

      【讨论】:

      • 你把 颠倒了。 2011-02-23 2011-02-22,但人们还没有结帐!)
      • 其实应该可以的。如果至少有一个预订在我想要的期间开始之后结束并在它结束之前开始,我认为房间不可用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-01
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      • 2013-01-18
      相关资源
      最近更新 更多