Ankündigung

Einklappen
Keine Ankündigung bisher.

MySQL-Abfrage zur Verfügbarkeit bei Buchungen (An-/Abreise)

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MySQL-Abfrage zur Verfügbarkeit bei Buchungen (An-/Abreise)

    Hallo, ich habe mir ein Statement geschrieben für eine Verfügbarkeitsanzeige für eine Website zur Vermietung von Ferienobjekten.
    Ab- bzw. Anreisetage sind gleichzeitig auch wieder An- bzw. Abreisetage. Bei meinem Statement bin ich mir nur gerade nicht sicher, ob ich alle Fälle abgedeckt habe.
    Vielleicht kann mal jemand drüberschauen:

    Code:
    SELECT * FROM buchung WHERE
    (anreise <= 20170701 AND abreise >= 20170701)
    OR (anreise <= 20170708 AND abreise >= 20170708)
    OR (anreise >= 20170701 AND abreise <= 20170708))
    In diesem Fall ist die Anreise am 01.07.2017 und Abreise am 08.07.2017.
    Vielen Dank.

  • #2
    wenn diese Abfrage nur für eine Wohnung ist dann passt es.

    select * ist nicht gut...

    Kommentar


    • #3
      Sowas geht übrigens sehr, sehr elegant mit DATERANGE-Typen und Exclusion Constraints in PostgreSQL.

      Code:
      test=*# create table zimmer (id int primary key, name text);
      CREATE TABLE
      test=*# create table buchung (zimmer int references zimmer, an_abreise daterange, exclude using gist(zimmer with =, an_abreise with &&));
      CREATE TABLE
      
      test=*# insert into zimmer values (1, 'Zimmer 1');
      INSERT 0 1
      test=*# insert into zimmer values (2, 'Zimmer 2');
      INSERT 0 1
      test=*# insert into zimmer values (3, 'Zimmer 3');
      INSERT 0 1
      test=*# insert into buchung values (1, '[2017-06-01,2017-06-30)');
      INSERT 0 1
      test=*# insert into buchung values (1, '[2017-07-10,2017-07-30)');
      INSERT 0 1
      test=*# insert into buchung values (2, '[2017-06-20,2017-07-01)');
      INSERT 0 1
      test=*# insert into buchung values (3, '[2017-07-05,2017-07-10)');
      INSERT 0 1
      test=*# select * from zimmer;
      id | name
      ----+----------
      1 | Zimmer 1
      2 | Zimmer 2
      3 | Zimmer 3
      (3 Zeilen)
      
      test=*# select * from buchung ;
      zimmer | an_abreise
      --------+-------------------------
      1 | [2017-06-01,2017-06-30)
      1 | [2017-07-10,2017-07-30)
      2 | [2017-06-20,2017-07-01)
      3 | [2017-07-05,2017-07-10)
      (4 Zeilen)
      Wenn Du wissen willst, welche Zimmer im genannten Zeitraum frei sind:

      Code:
      test=*# select distinct zimmer.id, zimmer.name from zimmer right join buchung on buchung.zimmer=zimmer.id where not buchung.an_abreise  && '[2017-07-01,2017-07-08)'::daterange;
       id |   name  
      ----+----------
        2 | Zimmer 2
        1 | Zimmer 1
      (2 Zeilen)
      Wenn Du wissen willst, welche Zimmer da belegt sind:

      Code:
      test=*# select * from zimmer right join buchung on buchung.zimmer=zimmer.id where buchung.an_abreise  && '[2017-07-01,2017-07-08)'::daterange;
       id |   name   | zimmer |       an_abreise        
      ----+----------+--------+-------------------------
        3 | Zimmer 3 |      3 | [2017-07-05,2017-07-10)
      (1 Zeile)
      Und wenn Du versucht, ein Zimmer doppelt zu belegen:

      Code:
      test=*# insert into buchung values (3, '[2017-07-09,2017-07-19)');
      FEHLER:  kollidierender Schlüsselwert verletzt Exclusion-Constraint »buchung_zimmer_an_abreise_excl«
      DETAIL:  Schlüssel (zimmer, an_abreise)=(3, [2017-07-09,2017-07-19)) kollidiert mit vorhandenem Schlüssel (zimmer, an_abreise)=(3, [2017-07-05,2017-07-10)).
      test=*#
      Aber Du hast ja MySQL, da geht all das nicht.
      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

      Kommentar


      • #4
        Zitat von akretschmer Beitrag anzeigen
        Aber Du hast ja MySQL, da geht all das nicht.
        Ja, in dem Fall ist das wirklich schade..

        Kommentar

        Lädt...
        X