带有日期范围的MySQL查询

时间:2011-11-15 10:31:17

标签: php mysql

我有一张包含以下记录的表格:

    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列时,不知道如何实现查询。

1 个答案:

答案 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功能。