我的数据库中有多个预订。每个预订属于不同的公寓。现在一些预订在同一日期被预订了两次,或者日期有点交叉,这意味着它被超额预订了我如何进行查询以过滤每个属性并找到超额预订并返回我他们的数量?我试过了:
function getOverbookingcount() {
$sql = "
SELECT *
FROM reservations a
INNER JOIN reservations b
ON DATE(b.start) > DATE(a.start) AND DATE(b.start) < DATE(a.end)
AND a.room_id != b.room_id
";
$result = return_ci()->db->query($sql);
return $result->result_array();
}
没有任何运气。
表:预订
-------------------------------------------------------------
DBASE_ID | room_id | start | end
-------------------------------------------------------------
1 |76036 |2015-12-15 14:00:00 | 2015-12-19 11:00:00
2 |76036 |2016-01-17 14:00:00 | 2016-01-19 11:00:00
3 |76036 |2015-10-29 14:00:00 | 2015-11-01 11:00:00
4 |76036 |2015-10-30 14:00:00 | 2015-11-05 11:00:00
5 |103099 |2015-12-15 14:00:00 | 2015-12-19 11:00:00
6 |103099 |2016-01-17 14:00:00 | 2016-01-19 11:00:00
7 |103099 |2015-10-29 14:00:00 | 2015-11-01 11:00:00
8 |103099 |2015-10-29 14:00:00 | 2015-11-03 11:00:00
最佳答案
您可以使用以下查询:
SELECT r1.DBASE_ID, r1.room_id, r1.start, r1.end
FROM reservations AS r1
INNER JOIN reservations AS r2
ON r1.room_id = r2.room_id AND
r1.DBASE_ID < r2.DBASE_ID AND
r1.start <= r2.end and r1.end >= r2.start
这些条件:
r1.start <= r2.end and r1.end >= r2.start
检查两个不同预订记录之间的重叠间隔。
如果两个预订记录重叠,上述查询将返回具有最小 DBASE_ID
的记录值(value)。要返回两条 记录,您应该使用:r1.DBASE_ID <> r2.DBASE_ID
而不是:r1.DBASE_ID < r2.DBASE_ID
.
关于php - 查找预订交叉日期(入住、退房)或每个房间 ID 的相同日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35654386/