2010-08-03 1 views
5

Ich hatte eine Situation in meinem Projekt, das wie folgt ist.brauchen Aktualisierung für MySQL-Abfrage für die Wahl Datumsbereich für die Reservierung eines Hotelzimmers oder einer Sache

während für die zur Verfügung stehenden Zimmer Überprüfung

$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.")"; 

Die erste Abfrage retrives die Liste der Zimmernummern aus der Buchungstabelle, die die daterange

ähnlich die zweite dos gleiche von der Tischreservierung erfüllt

Die letzte Abfrage verwendet die Liste, die von den beiden obigen Abfragen bereitgestellt wird, und ruft die Liste des Raums ab, die nicht in der generierten Liste enthalten ist.

funktioniert gut für 10-08-2010/15-08-2010

funktioniert gut für 20-08-2010/25-08-2010

, wenn ich die Daten zwischen 10 und 15 geben funktioniert in ähnlicher Weise für 20 und 25 und funktioniert auch gut für die Tage, 14-08-2010 und 21-08-2010

funktioniert aber nicht für 16-08-2010 bis 19-08-2010

brauchen jede Klärung bitte frag mich.

Danke.

+3

Verwenden Sie nicht $ _POST in einer Abfrage, ohne es zuvor zu bereinigen, es macht Ihre Site anfällig für SQL-Injektionen (Sie können alle Ihre Daten verlieren). – greg0ire

+0

@ greg0ire danke ich werde es im Hinterkopf behalten. Hast du meine Frage? oder brauchst du eine Klärung? Vielen Dank. – srinivas

+0

Was bedeutet "nicht funktioniert"? Erhalten Sie eine Fehlermeldung? Bekommen Sie MySQL-Fehler? – greg0ire

Antwort

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 
     ) 

Achten Sie auf die Reihenfolge oder die Argumente: @req_fdate hier ist der erste Tag hier (aus), @req_tdate ist das letzte Datum (bis).

Aug 16-Aug 19 für die Verfügbarkeit zu prüfen, verwenden Sie diese:

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

Welchen Datentyp haben die Felder check_indate und check_outdate?

meine Vermutung ist, dass das BETWEEN-Schlüsselwort nicht wie erwartet funktioniert. Arbeiten die Dinge anders, wenn Sie a BETWEEN b and c durch a >= b and a <= c ersetzen?

ps: Sie können auch versuchen zu debuggen, indem Sie Ihre Beispiele auf den Datentyp Ihrer Datumsspalten werfen. wenn wir Ihre check_indate Spalte ist vom Typ Datetime übernehmen, finden Sie in der, was mysql gibt zurück, wenn Sie versuchen, diese:

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

vs

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

Meine MySQL hier nicht auf beiden Beispielen, da es yyyy-mm erwartet -dd als Datumsformat, aber es könnte Ihnen einen Hinweis geben :)

0

ich auf die Art der Datenfeld aussehen würden Sie für die check_outdate und check_indate verwenden.

Wenn Sie "DATE" verwenden, stellen Sie sicher, dass die Eingabe im Format YYYY-MM-DD ist. Wenn Sie etwas anderes ohne Trennzeichen eingeben, wird MySQL das Datum erraten.Sie können die PHP-Funktion verwenden, um ein Datumsformat aus der DD-MM-JJJJ (oder was auch immer) auf das richtige Datum von MySQL erwartet zu konvertieren:

$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 

Wenn Sie ein VARCHAR oder fester Länge CHAR verwenden, dann String-Vergleiche möglicherweise nicht wie erwartet.

Verwandte Themen