【问题标题】:SQL To check if a set of dates fall within a specified range of datesSQL 检查一组日期是否在指定的日期范围内
【发布时间】:2011-02-17 09:29:40
【问题描述】:

我有一个表格,其中包含架构中房间不可用时的日期:

ROOM_ID | DATE_UNAVAILABLE

我需要一个 sql 查询来检查在两个日期范围内是否有可用房间 - 类似于

Select All rooms that are constantly available between date 1 and date 2

或者说

选择没有在日期 1 和日期 2 之间的日期不可用表中输入日期的所有房间

我在这里使用 php MySQL。

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    内部查询找到不可用的房间,然后我们使用 Not-exists left join 从结果中删除这些日期,只留下可用房间。

    SELECT r.ROOM_ID
    FROM rooms r LEFT JOIN (
        SELECT ROOM_ID
        FROM tableName
        WHERE DATE_UNAVAILABLE BETWEEN 'Date1' AND 'Date2'
        GROUP BY ROOM_ID
      ) g ON r.ROOM_ID = g.ROOM_ID
    WHERE g.ROOM_ID IS NULL
    

    或者,如果您有正确的索引,跳过该组可能会更快:

    SELECT r.ROOM_ID
    FROM rooms r LEFT JOIN tableName g ON r.ROOM_ID = g.ROOM_ID
        AND g.DATE_UNAVAILABLE BETWEEN 'Date1' AND 'Date2'
    WHERE g.ROOM_ID IS NULL
    

    【讨论】:

      【解决方案2】:

      如果你有另一张桌子,比如rooms,它可以是这样的:

      select * from rooms r where not exists
      (select * from room_unavail u
          where r.id = u.id and u.date_unavailable between date1 and date2)
      

      你不能只用你指定的一张桌子来做这件事,因为当桌子是空的时——所有房间都可用,但你不会得到任何结果。

      【讨论】:

        【解决方案3】:

        设 myRoomId 为给定房间的 ID,dateStart 和 dateEnd 为时间间隔的开始日期和结束日期。比:

        select count(*) from tblRooms
        where date_unavailable>=dateStart and date_unavailable<=dateEnd
        and room_id = myRoomId
        

        如果有可用空间,则给定 select 返回 0。

        【讨论】:

          猜你喜欢
          • 2017-01-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-25
          • 1970-01-01
          相关资源
          最近更新 更多