2011-11-15 147 views
0

我有如下记录的表: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),在2011年2月7日到2011年2月13日之间有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

我不认为这可以在一个查询中完成。我建议下面的算法(用伪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的函数不相同。

+0

你可以给我一个例子与mysql_query();功能?? – nicojmb