Abfrage, welche Zeitfenster frei sind

Ghost108

Neuer Benutzer
Beiträge
2
Guten Abend zusammen !

Ich habe eine Datenbank, in welche ich meine belegten Termine in die Tabelle "events" speichere.
Dort wird gespeichert, wann der Termin beginnt (Datum / Uhrzeit) und welcher Service zu diesem Termin gehört (service 1, service 2, service 3)

Mit Hilfe dieser SQL Query lasse ich mir alle möglichen Termine anzeigen, von heute bis + 30 Tage, Zeitfenster 14 - 18 Uhr, abzüglich meiner o.g. belegten Termine = nur noch freie Termine.


SELECT
DATE_ADD(DATE_ADD(DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY), INTERVAL day.seq DAY), INTERVAL hour.seq HOUR) as freetime
FROM
seq_0_to_30 AS day,
seq_14_to_18 AS hour
HAVING freetime NOT IN ( SELECT `start` FROM `events`)


Das funktioniert auch ganz gut - jetzt möchte ich meine Abfrage erweitern.
Ich bräuchte unterm Strich 2 unterschiedliche Abfragen:

Wenn der Benutzer auf den Button "Service 1" oder "Service 3" klickt, soll folgende Logik greifen:
-> Zeige mir alle freien Termine
--> Existiert an dem Tag bereits ein belegter Termin mit service 2, dann dürfen die vorherigen Zeitfenster dieses Tags nicht als "freie Termine" zur Verfügung stehen

Wenn der Benutzer auf den Button "Service 2" klickt, soll folgende Logik greifen:
-> Zeige mir alle freien Termine
--> Existiert an dem Tag bereits ein belegter Termin mit service 1 und / oder 3, dann dürfen die nachfolgenden Zeitfenster dieses Tags nicht als "freie Termine" zur Verfügung stehen

Mit der Hilfe eines anderen Users bin ich schon einen großen Schritt weitergekommen.
Sollte der User Service 2 wählen, wird folgendes Query ausgeführt:

SELECT

t.timeslots AS timeslots,

IF(COUNT(e_serviceA.id) > 0, 'blocked', null) AS service13,

IF(COUNT(e_serviceB.id) > 0, 'blocked', null) AS service2

FROM (

SELECT

DATE_ADD(DATE_ADD(DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY), INTERVAL day.seq DAY), INTERVAL hour.seq HOUR) as timeslots

FROM

seq_0_to_30 AS day, seq_14_to_18 AS hour

) t

LEFT JOIN

events e_serviceA ON t.timeslots BETWEEN DATE_SUB(e_serviceA.start, INTERVAL 4 HOUR) AND DATE_ADD(e_serviceA.start, INTERVAL 59 MINUTE) AND e_serviceA.service=2

LEFT JOIN

events e_serviceB ON t.timeslots BETWEEN e_serviceB.start AND DATE_ADD(e_serviceB.start, INTERVAL 239 MINUTE) AND e_serviceB.service=2

GROUP BY

t.timeslots

HAVING

`service2` IS NULL AND timeslots NOT IN ( SELECT `start` FROM `events`)

ORDER BY

t.timeslots



ABER, dennoch muss hier noch etwas falsch sein, denn folgendes Szenario habe ich getestet:

Es gab bereits einen Termin am 28.06.2021 mit service 1
User wählt service 2 aus und es wird richtigerweise nur noch 16:00 und 18:00 Uhr als freies Zeitfenster angezeigt. ABER: service 2 darf nicht um 18 Uhr gebucht werden, da service 1 im Vorfeld verfügbar ist.

Kurz gesagt: Service 2 darf niemals nach einem Service 1 oder 3 buchbar sein.

Habe hier mal aktuelle Beispielhaften zur Verfügung gestellt:
MariaDB 10.5 | db<>fiddle


Ich würde mich sehr über eure Unterstützung freuen - vielen lieben Dank ! :)
 
Werbung:
Oben