2015-11-09 104 views
0

我正在嘗試設置酒店預訂系統並遇到問題。我們正在努力尋找在多天和幾個月內可以使用房間的地方。以下是我們目前正在使用的四個查詢,但管理員無法提前預訂,直到有一個房間沒有任何活動。任何幫助都會很棒。酒店預訂日曆預訂邏輯問題

$sql_statementxf1 = "Select * FROM Hotels 
    WHERE EXISTS (
    Select * FROM cal_events 
    WHERE start_date >= $end_dated 
    AND cal_events.HotelID = Hotels.HotelID 
    ORDER BY start_date) 
    AND HotelID>0 
    AND Class != 'HO' 
    ORDER BY HotelBlock, HotelNumber"; 
$sql_statementxf = "Select * FROM Hotels 
    WHERE EXISTS (
    Select * FROM cal_events 
    WHERE end_date >= $start_dated 
    AND cal_events.HotelID = Hotels.HotelID) 
    AND NOT EXISTS ( 
    select * from cal_events 
    WHERE start_date=$start_dated 
    AND cal_events.HotelID = Hotels.HotelID) 
    AND HotelID>0 
    AND Class != 'HO' 
    ORDER BY HotelBlock, HotelNumber"; 
$sql_statementxf2 = "Select * FROM Hotels 
    WHERE NOT EXISTS ( 
    Select * FROM cal_events 
    WHERE cal_events.HotelID = Hotels.HotelID) 
    AND HotelID>0 
    AND Class != 'HO' 
    ORDER BY HotelBlock, HotelNumber"; 
$sql_statementxf3 = "Select * FROM Hotels 
    WHERE EXISTS ( 
    Select * FROM cal_events 
    WHERE start_date=$start_dated 
    AND end_date = $end_dated 
    AND CustomerID = $custid 
    AND PersonID != $personid 
    AND cal_events.HotelID = Hotels.HotelID) 
    AND HotelID>0 
    AND Class!='HO' 
    ORDER BY HotelBlock, HotelNumber"; 

回答

0

有很多奧祕在這個代碼(如爲什麼變量名稱似乎不與如何使用它們匹配),但有一點確實鶴立雞羣,$ sql_statementxf2沒有其他的像部分。 Xf,XF1和XF3對日期都非常小心。 XF2完全忽略日期,並且不包括所有帶日曆事件的任何酒店。這聽起來像是你所描述的問題行爲,因爲這是它唯一要做的評論,看看它是否能讓你獲得你想要的結果。

要稍微偏離問題,看起來您正在嘗試的是找到沒有您提供的範圍日曆條目的房間。我不知道你是如何結合前三聲明,但他們都通過使用簡單或語句代替:

select Hotels.* from Hotels 
    where not exists 
    (
    select * from cal_events 
    where cal_events.HotelID = Hotels.HotelID 
     and (cal_events.start_date between $start_Date and $End_Date 
     or cal_events.end_date between $start_Date and $End_Date 
     or (cal_events.start_date < $start_Date and cal_events.end_date > $End_date)) 
    ) 
     AND HotelID>0 
     AND Class != 'HO' 
    ORDER BY HotelBlock, HotelNumber 

那是什麼做的是它不包括三種類型的重疊的日期範圍,不要」 t顯示在此期間活動開始的房間,不顯示活動在此期間結束的房間,並且不顯示活動在活動開始之前和結束之後開始(完全重疊)的房間。最後一個看起來像你試圖避免客戶的雙重預訂,所以該部分可能會停留。