2016-04-01 12 views
1

Ich versuche ein Reservierungssystem zu erstellen und möchte prüfen, ob zwischen zwei Daten bereits eine Reservierung vorgenommen wurde. Mein SQL gibt jedoch immer false zurück.PHP SQL Zeile zwischen Daten auswählen

$reservation_date_start = date('y-m-d', strtotime($fields['reservation_date_start'])); 
$reservation_date_end = date('y-m-d', strtotime($fields['reservation_date_end'])); 

// Save data to database 
$table_name = $wpdb->prefix . 'mb_bookings'; 

$date_exists = $wpdb->get_results("SELECT * FROM $table_name 
WHERE (reservation_date_start >= $reservation_date_start AND reservation_date_start < $reservation_date_end) 
OR (reservation_date_end >= $reservation_date_start AND reservation_date_end < $reservation_date_end) 
AND (accommodation_id = $accommodation_id)" 
); 

ich schon versucht, die BETWEEN Funktion, aber auch ohne Erfolg.

Die Daten sind korrekt in der Datenbank (ymd)

Db Beispiel:

enter image description here

Jede Hilfe sehr geschätzt werden würde, wie ich es seit Tagen damit zu kämpfen habe ..

+0

Was ist der Fehler, den Sie bekommen? wo (a> b) oder (b> a) sollte sein wo ((a> b) oder (b> a)) mit der zusätzlichen Klammer – Alex7

+0

Was ist der Datentyp der Spalten 'reservation_date_start' und' reservation_date_end'? –

+0

@ Alex7 Das Problem, das ich bekomme, ist, dass die Abfrage immer 0 zurückgibt. Ich habe versucht, die zusätzliche Klammer hinzuzufügen, aber immer noch keinen Erfolg. – Thjeu

Antwort

0

Datumsformat y-m-d gibt 16-04-01. Ändern Sie es in Y-m-d, um 2016-04-01 zu erhalten. Abfrage sollte dann funktionieren.

Wenn ich Ihre Bedürfnisse richtig verstehe, möchten Sie überprüfen, ob sich zwei Perioden überschneiden. Ich denke, das sollte es tun (Marke hinzugefügt parnetheses und Apostrophe):

SELECT * 
FROM $table_name 
WHERE 
(
    (
    STR_TO_DATE('$reservation_date_start', '%Y-%m-%d') <= reservation_date_end 
    AND 
    STR_TO_DATE('$reservation_date_end', '%Y-%m-%d') > reservation_date_start 
    ) 
OR 
    (
    STR_TO_DATE('$reservation_date_end', '%Y-%m-%d') >= reservation_date_start 
    AND 
    STR_TO_DATE('$reservation_date_start', '%Y-%m-%d') < reservation_date_end 
    ) 
) 
AND (accommodation_id = $accommodation_id) 

EDIT

Vereinfachte Bedingung für überlappende:

SELECT * 
FROM $table_name 
WHERE 
     STR_TO_DATE('$reservation_date_end', '%Y-%m-%d') >= reservation_date_start 
    AND STR_TO_DATE('$reservation_date_start', '%Y-%m-%d') <= reservation_date_end 
    AND accommodation_id = $accommodation_id 
+0

Leider hatte es keine Wirkung. Die Abfrage $ date_exists gibt immer noch 0 zurück. – Thjeu

+0

Wirklich viele, viele, vielen Dank! Deine Lösung funktioniert endlich! Wenn ich versuche, Ihre Lösung zu verstehen, bedeutet dies, dass mySQL keine PHP-Datumswerte lesen kann? Und dafür muss es die Funktion STR_TO_DATE haben? – Thjeu

+0

@Thjeu Ich weiß es nicht. Ich bin nicht wirklich mySQL Benutzer, also habe ich STR_TO_DATE nur für den Fall hinzugefügt. In PostgreSQL würde es nur mit der Zeichenfolge "2016-04-01" funktionieren. – Furgas

0
$reservation_date_start = date('Y-m-d',strtotime($fields['reservation_date_start'])); 
$reservation_date_end = date('Y-m-d', strtotime($fields['reservation_date_end'])); 
+0

Leider hatte es keinen Effekt. Die $ date_exists-Abfrage gibt immer noch 0 zurück. – Thjeu

0

SELECT * FROM $ table_name WHERE date_filed ZWISCHEN reservation_date_start AND $ reservation_date_end;

+0

Ich verstehe nicht, dass Sie eine Lösung sind. Bitte korrigieren Sie mich, wenn ich falsch liege. Aber es gibt keine Spalte namens "date_filed", also sehe ich nicht, wie das funktionieren würde. – Thjeu