我有一张包含以下记录的表格:
id_hotel - fecha_desde - fecha_hasta
-------------------------------------------------- ----
4 2011-01-01 2011-01-14
4 2011-01-05 2011-01-30
4 2011-01-31 2011-02-07
4 2011-02-13 2011-02-25
3 2011-01-01 2011-03-14
5 2011-01-01 2011-01-29
5 2011-01-30 2011-02-27
我需要进行此查询:
我的日期为$desde = 2011-01-04
和$hasta = 2011-03-02
我必须给出的结果是id_hotel
此时有空,并且在两者之间找不到任何空的日子(例如:id_hotel 4),介于02/07/2011和13/02/2011之间6天无法使用。
因此id_hotel = 4
不必离开,而是3和5。
以id_hotel = 3
为例,我使用以下查询时没有问题:
SELECT id_hotel
FROM fechas_disponibilidad
WHERE \''. $desde. '\' BETWEEN fecha_desde AND fecha_hasta
AND \''. $hasta. '\' BETWEEN fecha_desde AND fecha_hasta
我的日期来自:2011-01-04和日期:03/02/2011
我必须给出的结果是id_hotel
此时可用,并且在两者之间找不到任何空日(例如:id_hotel 4),在02/07/2011和13/02/2011之间是6没有的日子。
因此id_hotel = 4
不必离开,而是3和5。
以id_hotel = 3
为例,我使用以下查询时没有问题:
但是当我有多个日期范围id_hotel列时,不知道如何实现查询。
答案 0 :(得分:0)
我认为不能在一个查询中完成。我建议使用以下算法(用伪SQL编写,替换我的select()
函数的实际数据库操作):
$results = array();
$hotels = select("SELECT DISTINCT id_hotel FROM fechas_disponibilidad WHERE '" . $desde . "' BETWEEN fecha_desde AND fecha_hasta")
foreach ($hotels as $hotel_id) {
$available_to = $desde;
while ($available_to < $hasta) {
$available_to = select("SELECT MAX(fecha_hasta) FROM fechas_disponibilidad WHERE id_hotel = " . $hotel_id . " AND '" . $availableTo . "' BETWEEN (fecha_desde - 1) AND fecha_hasta ");
if (isNull($available_to)) {
continue 2;
}
}
$results[] = $hotel_id;
}
或创建具有相同功能的MySQL功能。