2010-08-03 101 views
5

我在我的項目中的情況如下。需要更新爲MySQL查詢選擇日期範圍預訂酒店房間或任何東西

在檢查可用客房

$sel_from_bookings="SELECT room_no FROM `booking` WHERE (('".$_POST['req_tdate']."' BETWEEN check_indate AND check_outdate) OR ('".$_POST['req_fdate']."' BETWEEN check_indate AND check_outdate)"; 

$sel_from_reserv="SELECT room_no FROM `reservation` WHERE (('".$_POST['req_tdate']."' BETWEEN check_indate AND check_outdate) OR ('".$_POST['req_fdate']."' BETWEEN check_indate AND check_outdate))"; 

$sel_rooms="SELECT room_no FROM rooms WHERE room_no NOT IN (".$sel_from_bookings.") AND room_no NOT IN (".$sel_from_reserv.")"; 

第一個查詢從滿足日期範圍

同樣從表中保留相同的第二個DOS預訂表retrives房間號碼列表

最後一個查詢使用上述兩個查詢提供的列表並獲取不在生成列表中的房間列表。

工作正常10-08-2010/15-08-2010

爲20-08-2010/25-08-2010

工作正常,當我給10和15之間它的日期正常工作同樣爲20和25,也能正常工作的日期14-08-2010及21-08-2010

但不工作16-08-2010至19-08-2010

需要什麼澄清請問我。

謝謝。

+3

不要在查詢中使用$ _POST而不進行消毒,這會使您的站點容易受到SQL注入(您可能會丟失所有數據)。 – greg0ire 2010-08-03 08:24:28

+0

@ greg0ire謝謝我會記住它。你有我的問題嗎?或需要澄清?謝謝。 – srinivas 2010-08-03 09:14:04

+0

「不工作」是什麼意思?你有任何錯誤信息?你正在處理MySQL錯誤? – greg0ire 2010-08-03 09:30:54

回答

1
SELECT * 
FROM room 
WHERE room_no NOT IN 
     (
     SELECT room_no 
     FROM booking 
     WHERE check_outdate >= @req_fdate 
       AND check_indate <= @red_tdate 
     ) 
     AND room_no NOT IN 
     (
     SELECT room_no 
     FROM reservation 
     WHERE check_outdate >= @req_fdate 
       AND check_indate <= @red_tdate 
     ) 

關注:@req_fdate這裏是這裏的第一天(),@req_tdate是最後日期()。

要檢查可用性從Aug 16Aug 19,使用此:

SELECT * 
FROM room 
WHERE room_no NOT IN 
     (
     SELECT room_no 
     FROM booking 
     WHERE check_outdate >= '2010-08-16' 
       AND check_indate <= '2010-08-19' 
     ) 
     AND room_no NOT IN 
     (
     SELECT room_no 
     FROM reservation 
     WHERE check_outdate >= '2010-08-16' 
       AND check_indate <= '2010-08-19' 
     ) 
0

check_indate和check_outdate有哪些數據類型?

我的猜測是BETWEEN關鍵字未按預期工作。如果您將a BETWEEN b and c替換爲a >= b and a <= c,那麼以不同的方式工作?

$sel_from_bookings="SELECT room_no FROM `booking` WHERE (('".$_POST['req_tdate']."' >= check_indate AND '".$_POST['req_tdate']."' <= check_outdate) OR ('".$_POST['req_fdate']."' >= check_indate AND '".$_POST['req_fdate']."' <= check_outdate)"; 

$sel_from_reserv="SELECT room_no FROM `reservation` WHERE (('".$_POST['req_tdate']."' >= check_indate AND '".$_POST['req_tdate']."' <= check_outdate) OR ('".$_POST['req_fdate']."' >= check_indate AND '".$_POST['req_fdate']."' <= check_outdate))"; 

$sel_rooms="SELECT room_no FROM rooms WHERE room_no NOT IN (".$sel_from_bookings.") AND room_no NOT IN (".$sel_from_reserv.")"; 

PS:你也可以嘗試通過鑄造你的例子你的日期列的數據類型進行調試。如果我們假設您check_indate列是datetime類型的,在看什麼MySQL允許回來,如果你試試這個:

SELECT CAST('16-08-2010' as datetime); 

VS

SELECT CAST('20-08-2010' as datetime); 

這裏我的MySQL在這兩個例子中失敗,因爲它預計YYYY-MM -dd的日期格式,但它可能給你一個提示:)的順序或參數

0

我想看看你正在使用的check_outdate和check_indate數據字段的類型。

如果您使用的是「日期」,請確保輸入格式爲YYYY-MM-DD。如果您輸入的內容沒有分隔符,那麼MySQL將會第二次猜測日期。您可以使用PHP函數從DD-MM-YYYY(或其他)的日期格式轉換爲正確的日期由MySQL預期:

$date ='12-12-2007'; 
$dateTime = new DateTime($date); 
$formatted_date=date_format ($dateTime, 'Y-m-d'); 
echo $formatted_date; 
// This will output 2007-12-12 

如果您正在使用VARCHAR或固定長度的字符,然後字符串比較可能不如預期。