php - 查找预订交叉日期(入住、退房)或每个房间 ID 的相同日期

标签 php mysql codeigniter

我的数据库中有多个预订。每个预订属于不同的公寓。现在一些预订在同一日期被预订了两次,或者日期有点交叉,这意味着它被超额预订了我如何进行查询以过滤每个属性并找到超额预订并返回我他们的数量?我试过了:

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 .

Demo here

关于php - 查找预订交叉日期(入住、退房)或每个房间 ID 的相同日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35654386/

相关文章:

mysql - 优化 GROUP_CONCAT 查询

php - 如何扩展或修改 Codeigniter 日历以处理多日事件和每天多个事件

php - 无法使用 codeigniter 将值插入数据库

mysql - 是否可以在 MySQL 的 select 语句上触发?

mysql - 自增主键和复制

PHP:如何检查变量是否已初始化?当 var 设置为 NULL 时,isset 返回 false

php - 存储在 BLOB 中 - 仅 1 KB 数据,不存储图像

php - codeigniter - 如果查询结果返回行,如何更新数据库

php - 提交表单后如何在后台运行 PHP 脚本?

php - 模拟静态 Eloquent 模型方法,包括 find()