选择两个日期之间的可用房间

Posted

技术标签:

【中文标题】选择两个日期之间的可用房间【英文标题】:Select available rooms between two dates 【发布时间】:2010-10-02 14:39:13 【问题描述】:

我有上面的 mysql 表,上面有可用的日期和价格。第二张表包括房间详细信息。如何连接两个表以获得两个日期之间的可用房间而不是重复的内容。

【问题讨论】:

【参考方案1】:

这里很难为您提供完整的答案,因为您只向我们展示了包含预订的表格 - 我们无法知道有哪些房间可供选择。

返回至少在所选时间段内预订的房间的 room_id 的 SQL 可能是:

SELECT `room_id` , COUNT(*)
FROM `bookings`
WHERE `dt` BETWEEN "[start date]" AND "[end date]"
GROUP BY `room_id`;

如果您有一张房间表(而不是预订),您可以返回在此期间未预订的所有房间的列表:

SELECT `id`
FROM `rooms`
WHERE `id` NOT IN (
  SELECT DISTINCT( `room_id` )
  FROM `bookings`
  WHERE `dt` BETWEEN "[start date]" AND "[end date]"
);

修正

根据 OP 的反馈,现在的假设是:

该表包含从dt 列中的日期开始到次日结束的可用房间的详细信息(即酒店房间) 查询应返回可用于输入的整个期间的所有房间(因此只会返回从 DAY A 到 DAY B 可用的房间。

因此,修改后的代码为:

SELECT room_id
FROM available_rooms
WHERE dt BETWEEN "[start date]" AND DATE_SUB("[end date]",INTERVAL 1 DAY)
GROUP BY room_id
HAVING COUNT(*)=ABS(DATEDIFF("[start date]","[end date]"));

【讨论】:

抱歉,上表仅提供可用日期,第二表包含房间详情。 谢谢卢卡诺斯。它的效果非常好。我修改加入房间表的详细信息,现在看起来像这样: SELECT ,room_id FROM availability LEFT JOIN rooms ON availability.room_id=rooms.id WHERE active='1' AND city='".$_REQUEST[' city']."' AND dt BETWEEN '".$_REQUEST['from']."' AND DATE_SUB('".$_REQUEST['to']."',INTERVAL 1 DAY) GROUP BY room_id HAVING COUNT()=ABS(DATEDIFF('".$_REQUEST['from']."','".$_REQUEST['to']."')) - 我希望没问题。 乐于助人。但我会重复一个警告,你会在这里一次又一次地听到这样的警告——确保你清理了你在 SQL 语句中使用的任何参数,以防止 SQL 注入攻击等。快速谷歌搜索“SQL Injection MySQL php” ” 并阅读一些教程 - 它会在未来为您节省很多痛苦。 谢谢。我刚开始使用 OOP,现在我使用的是 ricocheting.com/code/php/mysql-database-class-wrapper-v3,我必须说它真的很棒。再次求助,不知道说什么好了。如果我能以某种方式提供帮助,请告诉我!!!【参考方案2】:
SELECT available.* , rooms.* FROM available, rooms 
WHERE available.room_id = rooms.room_id AND 
available.dt BETWEEN '2005-01-01' AND '2005-12-31'

【讨论】:

【参考方案3】:

假设您向我们展示的表格名为rooms_dates,还有另外两个表格roomsroom_details

select room.id, room_details.xxxxxxx from rooms
inner join room_details on rooms.id = room_details.room_id
where rooms.id in
  (
    select distinct room_id from rooms_dates
    where dt >= 'xxxx-xx-xx' and dt <= 'yyyy-yy-yy'
  );

【讨论】:

以上是关于选择两个日期之间的可用房间的主要内容,如果未能解决你的问题,请参考以下文章

如果一个日期包含 null,则在两个日期之间选择

如何在两个日期之间的时间选择一条记录

预订数据库中的可用性

从到达和离开日期选择未预订的房间

选择日期不在列表中的两个日期之间的天差

如果它在两个不同的日期之间,如何选择今天的日期[重复]