查找预订交叉日期(签到,结账)或每个房间ID相同的日期

时间:2016-02-26 14:32:38

标签: 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

1 个答案:

答案 0 :(得分:1)

您可以使用以下查询:

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值的记录。要返回两个记录,您应该使用:r1.DBASE_ID <> r2.DBASE_ID代替:r1.DBASE_ID < r2.DBASE_ID

Demo here