SQL SQL Abfrage begindate und enddate - Tag der im Zeitraum liegt ausgeben. Zimmerbuchung.

seadog

Ensign
Registriert
Juni 2003
Beiträge
153
Hallo liebes Forum,
ich habe gerade einen Knoten im Kopf, vielleicht könnt ihr mir helfen:
Ich habe eine Gästetabelle, die das Beginn- und Enddatum eines Aufenthalts erhält. Quasi wie eine Zimmerbuchung sowohl tagsüber als auch für Übernachtung, beides geht.
Ich möchte herausfinden, welche Gäste in der Woche an welchen Tagen ein Zimmer gebucht haben.
Bedeutet - so denke ich - ich führe für jeden Tag (Mo-So) eine SQL-Abfrage durch, welche mir die Gäste auflistet, die an jenem Tag (Montag z.B. 27.06.2022) ein Zimmer belegen.

Wie bekomm ich das denn hin?

Weil mit:
SELECT * FROM guests WHERE begindate >= '2022-06-27' and begindate<='2022-07-03'
Und mit Between '2022-06-27' and '2022-07-03' habe ich ja auch nur den Wochenzeitraum. Aber daraus möchte ich ja jeweils die einzelnen Tage aufgelistet haben.
Und SELECT * FROM guests WHERE begindate >= '2022-06-27' and begindate<='2022-07-27'
würde mir halt nur die ausgeben, die ausschließlich am 27.06 gebucht haben.

Also: Welche Gäste haben am z.B. Montag, 27.06.2022 ein Zimmer gebucht/belegt.


(Das Ganze könnte ich dann die Woche durchzählen, dann habe ich jeweils die Belegungen für jeden Wochentag. Hintenraus kommt noch PHP zum Einsatz.)

Ich weiß, dass es gehen muss aber ich komme gerade überhaupt nicht weiter.

Könnt ihr mir helfen?
Herzlichen Dank :)

Meine Beispielstabelle für diese Woche sieht folgend aus:


Idfirstnamelastnamebegindateendate
1OttoMustermann2022-06-272022-07-02
2ChristineLeckerundnächstewoche2022-07-012022-07-11
3FrederikeMustermann2022-07-022022-07-02
4PaulAndergrenze2022-07-032022-07-03
5FredNurnächstewoche2022-07-042022-07-09
6AnnaHubervorherigeWoche2022-06-212022-06-22
7PetraSchönvorherigeundaktuelleWoche2022-06-252022-06-28
 
Zeichenkette mit Date(Zeichenkette), sofern bei der verwendeten SQL-Engine verfügbar, in ein Datum umwandeln.
 
seadog schrieb:
Also: Welche Gäste haben am z.B. Montag, 27.06.2022 ein Zimmer gebucht/belegt.
warum genau kannst du jetzt nicht nachsehen, ob der Bereich von begindate und enddate den gegebenen Wert enthält? Dein Literal muss halt dann der gleiche Datentyp sein, also ein Date. In MySQL wäre das DATE'2022@06@27', in deiner unbekannten DB musst du mal nachsehen wie du ein Date Literal erzeust

Übrigens kann man ISO Date literale sogar über String Vergleiche nutzen, der Vorteil davon ist nämlich dass diese sortierbar sind
 
in oracle wäre das einfach
where sysdate between begindate and enddate;

wenn es nicht an jedem Tag einmal läuft musst du statt sysdate eben to_date('27.06.2022','DD.MM.YYYY') angeben.

wenn du das für jeden Tag ausführst bekommst du was du brauchst, oder ich habe deine Anforderung nicht verstanden :D
 
  • Gefällt mir
Reaktionen: seadog
Ich bin mir nicht sicher, ob ich dein Problem verstanden hab. Wenn du die Wochentage wissen willst, dann joine doch einfach eine Kalenderlookup an deine Buchungstabelle. Dann hast du sowas:

IdfirstnamelastnamebegindateendateWochentag
1OttoMustermann2022-06-272022-07-02Mo
1OttoMustermann2022-06-272022-07-02Di
.................
3 FrederikeMustermann2022-07-022022-07-02Sa
4PaulAndergrenze2022-07-032022-07-03So

Dann steht dein Tag mit in der Abfragemenge und und kannst selektieren, gruppieren und aggregieren, wie du lusig bist.

Was Datenbanken btw nicht mögen ist, eine Abfrage X mal anzunehmen, wo sich immer nur ein Wert ändert. Sprich Cursor, Schleifen und so Zeug. Sollte man versuchen zu vermeiden, wo immer es geht.
 
  • Gefällt mir
Reaktionen: trabifant und seadog
seadog schrieb:
Und SELECT * FROM guests WHERE begindate >= '2022-06-27' and begindate<='2022-07-27'
Vielleicht habe ich nur das Problem nicht verstanden, aber so funktioniert das eigentlich:
SQL:
DECLARE @Stichtag DATE = '2022-06-27';

SELECT *
FROM [#test] AS [t]
WHERE [t].[begindate] <= @Stichtag
      AND [t].[enddate] >= @Stichtag;
Du musst deine '<=' und '>=' vertauschen.
 
  • Gefällt mir
Reaktionen: nik_ und seadog
Azdak schrieb:
Ich bin mir nicht sicher, ob ich dein Problem verstanden hab. Wenn du die Wochentage wissen willst, dann joine doch einfach eine Kalenderlookup an deine Buchungstabelle. Dann hast du sowas:
Azdak, Danke! Der Join-Tipp ist auch super! Den probiere ich aus! Herzlichen Dank! :-)
Ergänzung ()

Creeping.Death schrieb:
Vielleicht habe ich nur das Problem nicht verstanden, aber so funktioniert das eigentlich:
SQL:
DECLARE @Stichtag DATE = '2022-06-27';

SELECT *
FROM [#test] AS [t]
WHERE [t].[begindate] <= @Stichtag
      AND [t].[enddate] >= @Stichtag;
Du musst deine '<=' und '>=' vertauschen.

Ups.
Doch du hast das Problem verstanden.
Creeping.Death Danke! - Das sollte der Knoten gewesen sein, ich sehe keinen Fehler mehr.

Für die Nachwelt:
SQL:
SELECT * FROM guests WHERE begindate <= '2022-06-27' AND enddate >= '2022-06-27';

Aber Azdak hat auch Recht, wenn man möglichst eine Abfrage durchführt und nicht für jeden Wochentag stetig eine SQL-Abfrage, wegen Effizenz, Last, Performance, Traffic und Co.
Also werde ich versuchen das in einer Abfrage zu behandeln und diese eine Abfrage in PHP so auszulesen.
Ich hoffe, es klappt.

Habt alle herzlichen Dank.
 
SQL:
WHERE begindate <= '2022-06-27'

So kann das übrigens je nach DBMS auch ganz schnell mal ein String-Vergleich anstatt eines Datumsvergleichs sein. Creeping.Death hat das geschickt umgangen, indem er der Variable direkt einen Typen zugeordnent hat und auf den Datentyp in der Tabelle nicht weiter eingegangen ist.
 
Zurück
Oben