@protest Wie du in meinem obigen Code schon siehst, kann ich mir die Endzeit bereits ausrechnen lassen.
Ankündigung
Einklappen
Keine Ankündigung bisher.
vergleichen unbeschränkt vieler Zeitspannen auf Überschneidung
Einklappen
Neue Werbung 2019
Einklappen
X
-
protestix Okay, dann versuche ich mal das ganze noch besser darzustellen.
Erzeugt wird die Tabelle durch folgende SQL:
Code:CREATE TABLE IF NOT EXISTS " . $fhwtest_table_name . "( id mediumint(9) NOT NULL AUTO_INCREMENT, personen int(2) NOT NULL, datum date NOT NULL, zeit time NOT NULL, laenge DECIMAL(2,1) NOT NULL, kontakt varchar(64) NOT NULL, name varchar(64) NOT NULL, UNIQUE KEY id (id) )
So, wie unschwer zu erkennen wären Überschneidungen folgende:id personen datum zeit laenge kontakt name 1 2 2017-02-15 12:02:00 4 test@test.de Testperson 2 5 2017-02-15 14:00:00 3,5 test@test.de Testperson 3 8 2017-02-15 15:06:00 2 test@test.de Testperson 4 25 2017-02-15 13:30:00 1 test@test.de Testperson
einfache: id 1 und 4 zwischen 13:30 und 14:00, id 1 und 2 zwischen 14:30 und 15:06
doppelte: id 2 und 3 zwischen 16:02 und 17:06
dreifache: id 1, 2 und 4 zwischen 14:00 und 14:30, id 1, 2 und 3 zwischen 15:06 und 16:02
Hoffe ich habe nichts vergessen.
Theoretisch könnte man jetzt überall noch eine person dazu buchen. Maximal eben bei den dreifachen überschneidungen. Alle anderen können theoretisch mehr sein, so dass maximal 4 gleichzeitig belegt sind.
Waren das genug Infos oder kann ich dir noch irgend etwas stellen, mit dem du etwas anfangen kannst?
Kommentar
-
Ich würde die Endzeit anstelle oder zusätzlich zu der laenge angeben. Dann kannst Du das per Query ermitteln... als schematisches Beispiel:
Code:select count(id) Anzahl from table_name where (wunschstartzeit between startzeit and endzeit) or (wunschendzeit between startzeit and endzeit)
Competence-Center -> Enjoy the Informatrix
PHProcks! • Einsteiger freundliche Tutorials • PreComposed Packages
Kommentar
-
Deine DB-Struktur ist falsch aufgebaut, daher denkst du auch in die falsche Richtung, wegen des Eingabeformulars.
Wenn du 4 Räume hast die du belegen kannst, dann musst du auch wissen welche Räume wann belegt sind. Das geht aus deine Tabelle nicht hervor, daher hast du diese Probleme.
Du solltest eine Tabelle haben mitid personen datum beginn ende raum kontakt name 1 2 2017-02-15 12:02:00 16:00:00 1 test@test.de Testperson 2 5 2017-02-15 14:00:00 17:30:00 2 test@test.de Testperson 3 8 2017-02-15 15:06:00 17:00:00 3 test@test.de Testperson 4 25 2017-02-15 13:30:00 14:30:00 3 test@test.de Testperson
Wenn du dein Formular so lassen willst, also mit Anfangszeit und Dauer, dann musst in PHP vor Abfrage der DB eben die Dauer der Anfangszeit hinzuaddieren um die Endzeit zu erhalten.
Danach kannst du ganz bequem mit einer SQL-Anfrage bestimmen ob für den angefragten Zeitraum noch Platz in einen der Räume zur Verfügung steht.
Auch kannst du jetzt ermitteln wann der letzte Raum frei wird, wegen Reinigung oder ähnliches, das ging vorher alles nicht.
Die Räume packst du zusätzlich in eine weitere Tabelle, wo du weitere Infos hinterlegst, wie zum Beispiel Kapazität, Leinwand, Raumgrösse, etc.
Die Id der Tabelle Raum ist dann der Wert der der in Spalte raum in der Tabelle reservierung steht.
Tabelle Raum
Id Kapazität Raumgrösse
1 20 30
2 30 50
3 30 50
4 100 200
Kommen neue Räume irgendwann hinzu kannst du diese dort einfügen.
Die SQL-Abfrage ob ein Raum am 15.12.2017 ab 12 Uhr für 2 Stunden frei ist sieht so aus:
PHP-Code:SELECT
r.id, r.personen, r.datum, r.raum
FROM
reservierung r
Left Join
raum m
ON r.raum = m.id
WHERE
datum = '2017-02-15'
AND
('14:00:00' <= `beginn`
AND
'12:00:00' >= `ende`)
Kommentar
-
Hm, die ausgabe in deinem Link ganz unten überschneidet sich doch nicht...? Oder hab ich einen Denkfehler?
akretschmer Flexibiltät und Performance, natürlich gibt es elegantere Möglichkeiten, wie gehabt halt mit PostgreSQL.
Das ist eine Lösung mit einfachen Mitteln, die die (ursprüngliche) Anforderungen erfüllt. Wenn es um 4 Räume geht, deren Buchung kontrolliert wird, dann wird sich die Datenmenge in Grenzen halten.
Gebucht wird idR für die Zukunft und da kann man dann schon ein paar entspannende Einschränkungen vornehmen zur Datenbegrenzung.
Kann natürlich auch sein, dass es sich um ein Stundenhotel handelt und das Angebot dort so atraktiv ist, dass es über Jahre ausgebucht sein wird.
Dann wird es vielleicht brenzlig.
einem Ansatz aus, wo die Daten richtig in der DB stehen und die DB diese gesamte Aufgabe übernimmt
Die Daten stehen "richtig" in der DB, ich halte eine Intervallangabe für vollkommen legitim.
Dass am Ende gar keine bloße Zeitüberschneidung gefragt ist und die ursprüngliche Anforderung maximal auf ein Zimmer mit 4 Betten im Herbergszimmer (oder eben Stundenhotel) passt, nicht aber zum Problem des TE, macht eine Diskussion zur Umsetzung fraglich.
- 1 Likes
Kommentar
-
Zitat von JohnHSmith Beitrag anzeigenDanke für die ganzen Denkanstöße!
habe jetzt seit 1 Stunde die Datenbank geändert, aber wie kann ich das ohne die Angabe des Raumes machen? Den "Reservierern" ist es egal welcher Raum, da überall gleiche Ausstattung und Größe.
Darauf hat aber protestix schon ein Beitrag zuvor hingewiesen!
Zitat von protestix Beitrag anzeigenDeine DB-Struktur ist falsch aufgebaut, daher denkst du auch in die falsche Richtung, wegen des Eingabeformulars.
Wenn du 4 Räume hast die du belegen kannst, dann musst du auch wissen welche Räume wann belegt sind. Das geht aus deine Tabelle nicht hervor, daher hast du diese Probleme.
vergleichen unbeschränkt vieler Zeitspannen auf Überschneidung
Dann schau dir mal diese beiden Raumbelegungsbeispiele an:
Fall 1:
Code:Raum 1 ------- Raum 2 ------ Raum 3 ------- Raum 4 ----- Anfrage -------------------------------
Code:Raum 1 ------- ------ ------- ----- Raum 2 Raum 3 Raum 4 Anfrage -------------------------------
Kommentar
-
Zeig doch erstmal wie deine DB-Struktur jetzt aktuell aussieht. Bevor du dein INSERT machst solltest du dir die Zeit nehmen um über eine exakte Aufgabenstellung nachzudenken.
Dabei solltest du Fragen wie- Welchen Raum belege ich wenn mehrere Alternativen bereitstehen
- Soll eine Raumbelegung automatisiert erfolgen oder überlasse ich den Nutzer die Entscheidung
Kommentar
-
Die jetzige DB-Stuktur:
Code:CREATE TABLE IF NOT EXISTS " . $fhwtest_table_name . "( id mediumint(9) NOT NULL AUTO_INCREMENT, personen int(2) NOT NULL, start datetime NOT NULL, ende datetime NOT NULL, kontakt varchar(64) NOT NULL, name varchar(64) NOT NULL, bahnen enum('1','2', '3', '4'), UNIQUE KEY id (id) )"
Und die Raumbelegung soll komplett automatisch erfolgen.
Der Benutzer soll buchen können, und ihm wird in der Datenbank automatisch ein Raum zugewiesen.
Kommentar
-
Also doch kein Stundenhotel, da geht die Motivation zu helfen doch gleich auf 50% runter
Dir fehlt die Tabelle bahnen. Vergiss einfach dass es enum gibt, das ist fast immer der falsche Ansatz.
Die Spalte Bahnen enthält dann die id aus der Tabelle bahnen.
Bitte noch ändern und uns zeigen(create statement)
Kommentar
-
Zuletzt geändert von JohnHSmith; 07.06.2017, 08:20.Leider nein, Stundenhotel fände ich auch deutlich interessanter
Brauche ich diese Tabelle bahnen denn unbedingt? Ich muss nichts weiter abspeichern als das, was in der ersteren Tabelle gegeben ist. Insofern sollte doch eine weitere Spalte mit bahnen reichen, oder?
Kommentar
Kommentar