SQL来检查一组日期是否在指定的日期范围内

SQL来检查一组日期是否在指定的日期范围内,sql,mysql,Sql,Mysql,我有一个表格,其中记录了模式中房间不可用的日期: ROOM_ID | DATE_UNAVAILABLE 我需要一个sql查询来检查一个房间在两个日期之间是否可用——这是一个类似于 Select All rooms that are constantly available between date 1 and date 2 或者更确切地说 选择所有未在日期1和日期2之间的日期不可用表中输入日期的房间 我在这里使用的是php MySQL。内部查询查找不可用的文件室,然后使用not exists

我有一个表格,其中记录了模式中房间不可用的日期:

ROOM_ID | DATE_UNAVAILABLE
我需要一个sql查询来检查一个房间在两个日期之间是否可用——这是一个类似于

Select All rooms that are constantly available between date 1 and date 2
或者更确切地说

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


我在这里使用的是php MySQL。

内部查询查找不可用的文件室,然后使用not exists left联接从结果中删除这些日期,只留下可用的文件室

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

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

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)

您不能仅对指定的一个表执行此操作,因为当该表为空时,所有房间都可用,但您不会得到任何结果。

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

select count(*) from tblRooms
where date_unavailable>=dateStart and date_unavailable<=dateEnd
and room_id = myRoomId
如果房间可用,则给定的select返回0