Zeitspannen Ergebnisse zusätzlich miteinander vergleichen

schmir29

Benutzer
Beiträge
7
Hallo zusammen,

ich glaube ich sitze schon zu lange dran und sehe den Wald vor lauter Bäumen nicht mehr.

Folgendes Problem:

Angenommen ich habe einen Raum in den gleichzeitig sagen wir 100 Leute rein passen. Die Leute dürfen den Raum zu bestimmten Zeiten betreten und dürfen unterschiedliche lange in dem Raum bleiben. Manche Leute dürfen 60min drin bleiben andere 90min und wieder andere 120min.
Die Leute dürfen den Raum nur zu bestimmten Zeiten betreten sagen wir mal 14:00 Uhr, 14:30 Uhr, 15:00 Uhr, 15:30 und 16:30. Jede Startzeit hat eine andere länge. Also die zum Beispiel die um 14:30 rein kommen dürfen 90min drin bleiben, die um 15 Uhr kommen nur 60min.

Jetzt muss ich gucken das ich eine Abfrage generiere die mir immer ausgibt ob zu einer bestimmten Startzeit noch Leute in den Raum rein passen.

Dazu habe ich eine Tabelle in die ich eintrage wieviele Leute zu welcher Zeit kommen wollen. Da die Zeiten sich aber überschneiden und teilweise Zeiten mitten innerhalb einer Zeit enden erweist sich dieses für mich als schwierig.

Die Tabelle reservierungen hat folgende Felder:
id datum anzahl uhrzeit endzeit dauer

die Dauer ist eine id die in einer anderen Tabelle duration dann auch in Minuten drin steht.

derzeit lasse ich zu jeder Zeit eine Abfrage laufen.

SELECT id, anzahl, uhrzeit, datum, dauer FROM reservierungen WHERE datum='06.01.2017' AND (uhrzeit BETWEEN '15:00:00' AND '15:59:59' OR endzeit BETWEEN '15:00:00' AND '15:59:59')

eine Sekunde habe ich abgezogen, damit die Leute die um 16:00 Uhr starten nicht mit eingerechnet werden. Davon lasse ich mir die Anzahl ausgeben. Das klappt auch gut. Allerdings gibt es dabei ein Problem.

Leute - Startzeit - Dauer
9 - 14:00:00 - 90
9 - 14:30:00 - 90
37 - 14:30:00 - 60
40 - 15:00:00 - 60
5 - 15:30:00 - 90
8 - 15:30:00 - 60
von 15:00- 16:00 wären also 108 Leute im Raum. Allerdings verlassen ja auch wieder um 15:30 48 Leute den Raum so das keine 108 Leute gleichzeitig im Raum drin sind.
Wie kann ich das nur in die Query mit einbauen das berücksichtigt wird das die Zeitüberschneidung nicht alle betrifft.

Ich hoffe ich konnte mein Problem verständlich darstellen.

Freue mich über kompetente Antworten.

Danke euch
Miriam
 
Werbung:
Muß es in MySQL sein? Mir fiele spontan TIMESTAMPRANGE als Datentyp ein - und PostgreSQL als Datenbank. Damit, denke ich, ist das relativ trivial umsetzbar.
 
Ja der Provider stellt die mysql DB zur Verfügung und da läuft auch bereits einiges drauf. Auf eine andere DB kann ich nicht switchen. Habe auch keinen root Server auf dem ich etwas anderes installieren könnte.
 
Man kann z.B. bei Amazon sich eine PostgreSQL-DB einrichten, kostenfrei. Man hat da IIRC 2GB Speicher. Auf die kannst Du auch von außen zugreifen.

Code:
test=*# \d zimmer
  Table "public.zimmer"
 Column  |  Type  | Modifiers
---------+---------+-----------
 anzahl  | integer |
 von_bis | tsrange |

test=# select * from zimmer ;
 anzahl |  von_bis   
--------+-----------------------------------------------
  9 | ["2017-01-07 14:00:00","2017-01-07 15:30:00")
  9 | ["2017-01-07 14:30:00","2017-01-07 16:00:00")
  37 | ["2017-01-07 14:30:00","2017-01-07 15:30:00")
  40 | ["2017-01-07 15:00:00","2017-01-07 16:00:00")
  5 | ["2017-01-07 15:30:00","2017-01-07 17:00:00")
  8 | ["2017-01-07 15:30:00","2017-01-07 16:30:00")
(6 rows)

Wenn Du wissen willst, wie viele um 15:02 im Zimmer sind:

Code:
test=*# select sum(anzahl) from zimmer where von_bis @> '2017-01-07 15:02:00'::timestamp;
 sum
-----
  95
(1 row)

Ich hätte auch eine Idee, einen Constraint zu definieren, daß nur maximal 100 Leute da eingebucht werden können. Aber Du scheinst ja bei MySQL bleiben zu wollen.

Grüße aus Flensburg.
 
Die Tabelle reservierungen hat folgende Felder:
id datum anzahl uhrzeit endzeit dauer

die Dauer ist eine id die in einer anderen Tabelle duration dann auch in Minuten drin steht.

Btw.: entweder start- und endzeit, start und dauer, dauer und ende. Nicht aber alle 3 Werte, das ist redundant. Die Dauer hier als FK zu definieren ist nicht wirklich dumm, aber auch nicht sonderlich klug. Das macht eigentlich nur Sinn, wenn Du nur bestimmte Werte für die Dauer erlauben willst. Wenn also z.B. da der Kunde eine Karte kauft und er für N Minuten in den Raum darf, dann ist das ok.
 
Werbung:
Thema kann geschlossen werden. Habe das jetzt gelöst.

Da das bei mysql nicht so einfach ist habe ich das nun halbstündlich berechnen lassen und mache dafür mehrere Abfragen. Da die höchst mögliche Zeit 120 ist sind das dann zwar 4 Abfragen aber die Tabelle an den jeweiligen Tagen ist nicht gross und damit geht das ganze auch schnell. Bekomme nun mit noch eine paar kleinen Änderungen der Query die korrekten Werte angezeigt.

SELECT id, anzahl, uhrzeit, datum, dauer FROM reservierungen WHERE datum='06.01.2017' AND ((uhrzeit >= '15:00:00' AND uhrzeit < '16:00:00') OR (endzeit >= '"15:00:00' AND endzeit < '16:00:00') OR (uhrzeit < '16:00:00' AND endzeit > '15:00:00'))

musste um alle Fälle abzudecken noch die Zeitüberschneidungen mit einbauen die Meinetwegen von 14:30 - 16:30 gehen wenn die Abfrage für 15 - 16 Uhr vorgesehen ist. Läuft auch alles soweit sauber.
 
Zurück
Oben