phillip: zeitraumüberschneidung

hallo und moin moin!

ich bräuchte kurz hilfe bei einer SQL abfrage.
in einem reisebüro-buchungsvorgang soll überprüft werden, ob ein angebot im gewünschten zeitraum bereits belegt ist.

in der datenbank gibt es in der buchungstabelle ein feld "von" und eines "bis", beide vom typ date.
über ein formular wird der gewünschte zeitraum ausgewählt der dann in dieser form vorliegt:

gewünschter von zeitraum: '".$_POST["jahr_v"]."-".$_POST["monat_v"]."-".$_POST["tag_v"]."'
gewünschter bis zeitraum: '".$_POST["jahr_b"]."-".$_POST["monat_b"]."-".$_POST["tag_b"]."'

dies ist meine bisherige abfrage, sie noch nicht funktioniert:

mysql_query("SELECT * FROM phillip_r_buchungen
WHERE angebots_id='".$_GET["angebot_id"]."'
AND von <= '".$_POST["jahr_v"]."-".$_POST["monat_v"]."-".$_POST["tag_v"]."'
AND bis >= '".$_POST["jahr_b"]."-".$_POST["monat_b"]."-".$_POST["tag_b"]."';") or die (mysql_error());

sie soll also feststellen, ob in irgendeiner form eine überschneidung zwischen dem gewünschten und den gespeicherten buchungszeiträumen vorhanden ist.

vielen dank für eure hilfe im vorfeld!

  1. sie soll also feststellen, ob in irgendeiner form eine überschneidung zwischen dem gewünschten und den gespeicherten buchungszeiträumen vorhanden ist.

    Es gibt vier Möglichkeiten für eine Überschneidung:

    Möglichkeit | 1    | 2      | 3      | 4
     Zeitraum A |  --  | ----   |   ---- | ----
     Zeitraum B | ---- |   ---- | ----   |  --

    Eine Überschneidung liegt vor, wenn Anfang A kleiner als Ende B und Ende A größer als Anfang B ist.

    Keine Überschneidungen gibt es nur in zwei Fällen:

    Nicht-Möglichkeit | 5       | 6
           Zeitraum A | ---     |     ---
           Zeitraum B |     --- | ---

    Du hast

    von <= '".$_POST["jahr_v"]."-".$_POST["monat_v"]."-".$_POST["tag_v"]."'
    AND bis >= '".$_POST["jahr_b"]."-".$_POST["monat_b"]."-".$_POST["tag_b"]."';"

    also Anfang A kleiner Anfang B und Ende A größer Ende B. Damit greifst du lediglich Fall 4 ab.

  2. moin!

    mysql_query("SELECT * FROM phillip_r_buchungen
    WHERE angebots_id='".$_GET["angebot_id"]."'
    AND von <= '".$_POST["jahr_v"]."-".$_POST["monat_v"]."-".$_POST["tag_v"]."'
    AND bis >= '".$_POST["jahr_b"]."-".$_POST["monat_b"]."-".$_POST["tag_b"]."';") or die (mysql_error());

    Die Abfrage ist so, dass der angefragte Zeitraum $_POST komplett innerhalb des DB-Zeitraums liegen muss. Ist das gewünscht?

    Also wenn du _keinen_ Treffer bekommst, ist das dein Erfolg?

    Habe nicht ganz verstanden, was du erreichen möchtest, da du ja nur ein bestimmtes Ereignis angebot_id heranziehst.

    Kalle

  3. yo,

    sie soll also feststellen, ob in irgendeiner form eine überschneidung zwischen dem gewünschten und den gespeicherten buchungszeiträumen vorhanden ist.

    es reicht aus, wenn du du den endwert mit dem jeweiligen startwert des anderen zeitraums vergleichst um umgekehrt, also zwei logische bedingungen. ich bin mal ein wenig faul und nehme mal pseudovariablen.

    SELECT *
    FROM phillip_r_buchungen
    WHERE WHERE angebots_id = $irgend_eine_id
    AND bis >= $hier_post_startwert
    AND von <= $hier_post_endwert
    ;

    damit solltest du alle datensätze bekommen, die sich mit den zeitraum des formulars überschneiden

    Ilja