2016-03-31 21 views
3

Im auf einem Besprechungsraum Reservierungssystem arbeiten, und ich Mühe habe, herauszufinden, ob ein Raum innerhalb eines festgelegten Zeitraums genommen wird, verwende ich das aktuelle Format für Daten und hat die Art zu DATETIME in der Tabelle: YYYY-MM-DD HH:II:SSWie überprüft man, ob eine Buchung innerhalb des Zeitrahmens existiert?

Dies ist mein aktueller Code:

//Function to check if a booking exists: 
function bookingExist($DateStart, $DateEnd, $RoomNo) { 
    global $DB; 

    $sql = "SELECT * FROM bookings WHERE date_start = :dateStart AND date_end = :dateEnd AND room_no = :roomNo"; 
    $Q = $DB->prepare($sql); 
    $Q->bindParam(':dateStart', $DateStart); 
    $Q->bindParam(':dateEnd', $DateEnd); 
    $Q->bindParam(':roomNo', $RoomNo); 
    $Q->execute(); 

    if ($Q->rowCount()) { 
     //A record exists... 
     return true; 
    } else { 
     //no record exists 
     return false; 
    } 
} 

gibt es eine Möglichkeit, dies in der sQL-Abfrage zu tun?

Beispiel: Raum A ist gebucht zwischen 2016-03-31 15:00:00 und 2016-03-31 17:30:00 Der Benutzer versucht dann, eine neue Buchung für Raum A für 2016-03-31 16 zu erstellen : 30: 00 - 2016-03-31 17:00:00 und thsi sollte 1 Datensatz zurückgeben, da es eine Buchung gibt

+0

das Zimmer von Datum genommen wird und Zeit A zu Datum und Zeit B. Also, wenn Eith Wenn der Anfang oder das Ende Ihres neuen Zeitrahmens zwischen A und B liegt, wird er genommen. Ist das, was Sie in SQL brauchen? – Renan

+0

@Renan hier ist ein Beispiel: Zimmer A ist gebucht zwischen 2016-03-31 15:00:00 und 2016-03-31 17:30:00 Benutzer versucht dann, eine neue Buchung für Zimmer A für 2016 zu erstellen -03-31 16:30:00 - 2016-03-31 17:00:00 und thsi sollte 1 Datensatz zurückgeben, da es eine Buchung gibt –

+0

Siehe meine aktualisierte Antwort. –

Antwort

2
SELECT * 
FROM bookings 
WHERE 
    (
    :dateStart BETWEEN date_start AND date_end 
    OR :dateEnd BETWEEN date_start AND date_end 
    OR date_start BETWEEN :dateStart AND :dateEnd 
) 
    AND room_no = :roomNo 

Dies gibt Ihnen Reihen Null, wenn der Raum in Ihnen bestimmten Zeit zu nicht ausgebucht ist: dateStart -: dateEnd. :dateStart BETWEEN date_start AND date_end wird prüfen, ob es bereits bei Startzeit gebucht ist, :dateEnd BETWEEN date_start AND date_end Wenn es am Ende der Zeit gebucht überprüfen wird und die letzten date_start BETWEEN :dateStart AND :dateEnd auch wichtig ist, überprüft es, ob das Raumbuch dazwischen (kürzere Zeit zum Beispiel)

EDIT ist : OP-Zeiten und keine AND;)

EDIT2: die Start- und Endzeiten auszuschließen, haben Sie die BETWEEN Schlüsselwort zu erweitern und die Beziehung nur machen sein, <:

SELECT * 
FROM bookings 
WHERE 
    (
    (date_start < :dateStart AND :dateStart < date_end) 
    OR (date_start < :dateEnd AND :dateEnd < date_end) 
    OR (:dateStart < date_start AND date_start < :dateEnd) 
) 
    AND room_no = :roomNo 
+0

das: dateStart sollte es mein Spaltenname oder das tatsächliche Datum sein? –

+0

': dateStart' ist Ihre Variable' $ DateStart' und 'date_start' ist Ihre Spalte. Ich habe nur den gleichen Namen wie Sie in Ihrer Frage verwendet. –

+0

Was ist, wenn eine Buchung endet um 17:00 Uhr heute, und ich möchte ein Treffen von 17:00 bis 18:00 Uhr buchen? –

0

was ist mit BETWEEN in der SQL-Abfrage? Sie müssen die Datums-/Zeitparameter festlegen, die Sie überprüfen (dies sind die vom zweiten Benutzer im angegebenen Beispiel angeforderten Daten/Zeiten).

$firstDate = //start of time period you are checking; 
$lastDate = //end of time period you are checking; 
$Q->bindParam(':firstDate ', $firstDate); 
$Q->bindParam(':lastDate ', $lastDate); 

$sql = "SELECT * FROM bookings WHERE :date_start BETWEEN :firstDate AND :lastDate AND room_no = :roomNo"; 
+0

Wie folgt: '' '" SELECT * FROM Buchungen WHERE date_start BETWEEN: dateStart UND date_end BETWEEN: dateEnd UND room_no =: roomNo "' '' –

+0

Ich bekomme einen Fehler beim Ausführen der Abfrage: '' '# 1064 - Sie haben ein Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, für die richtige Syntax, die in der Nähe von '14: 00: 00 AND 2016-03-31 17:00:00 AND room_no = 1 LIMIT 0, 30 'in Zeile 1''' verwendet werden soll Die Abfrage: '' 'SELECT * FROM Buchungen WHERE date_start ZWISCHEN 2016-03-31 14:00:00 UND 2016-03-31 17:00:00 UND room_no = 1''' –

+0

sieht aus wie Sie die vermissen Doppelpunkt in fornt von date_start - sollte der Parameter sein ": date_start" – gavgrif

Verwandte Themen