2011-11-15 144 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