Ankündigung

Einklappen
Keine Ankündigung bisher.

vergleichen unbeschränkt vieler Zeitspannen auf Überschneidung

Einklappen

Neue Werbung 2019

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

  • #31
    @protest Wie du in meinem obigen Code schon siehst, kann ich mir die Endzeit bereits ausrechnen lassen.

    Kommentar


    • #32
      Richtig, das ist dann aber schon php und auf die Rückgabe der Daten aus der DB bezogen.
      Die meisten gehen aber von einem Ansatz aus, wo die Daten richtig in der DB stehen und die DB diese gesamte Aufgabe übernimmt.
      Ist erstens schneller und zweitens besser wartbar.

      Kommentar


      • #33
        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)
                )
        Ich habe 4 Testeinträge in der Datenbank, siehe hier:
        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
        So, wie unschwer zu erkennen wären Überschneidungen folgende:
        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


        • #34
          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)
          Ab Anzahl > 3 ist dann vorbei
          Competence-Center -> Enjoy the Informatrix
          PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

          Kommentar


          • #35
            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 mit
            id 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
            .idr.personenr.datumr.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`) 
            ungetestet.

            Kommentar


            • #36
              Danke 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.

              Kommentar


              • #37

                Hm, die ausgabe in deinem Link ganz unten überschneidet sich doch nicht...? Oder hab ich einen Denkfehler?
                JohnHSmith Ich seh da nichts, was sich nicht überschneidet, welche Werte meinst Du?

                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
                protestix
                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.

                Kommentar


                • #38
                  Zitat von JohnHSmith Beitrag anzeigen
                  Danke 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.
                  Die Umsetzung deiner Aufgabe ohne zu wissen welche Räume wann belegt sind ist nicht möglich.
                  Darauf hat aber protestix schon ein Beitrag zuvor hingewiesen!

                  ​​​​​​​
                  Zitat von protestix Beitrag anzeigen
                  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.
                  Dein Denkansatz, welcher im Titel mit
                  vergleichen unbeschränkt vieler Zeitspannen auf Überschneidung
                  trifft für dein Problem nicht zu und damit sind auch alle Vorschläge die ich bis zum Beitrag #24 gemacht habe hinfällig. Du scheinst nicht begreifen zu wollen, das du die Räume brauchst.
                  Dann schau dir mal diese beiden Raumbelegungsbeispiele an:

                  Fall 1:
                  Code:
                  Raum 1     -------   
                  Raum 2              ------
                  Raum 3                       -------
                  Raum 4                                 -----
                  
                  Anfrage     -------------------------------
                  Fall2:
                  Code:
                  Raum 1     -------  ------   -------   -----   
                  Raum 2              
                  Raum 3                      
                  Raum 4                                 
                  
                  Anfrage     -------------------------------
                  Ohne Raumzuordnungen hast du gleiche Zeitintervalle und "Überschneidungen". Nur für Fall1 ist die Anfrage negativ zu beantworten, für Fall2 kann dagegen noch unter 3 Räumen ausgewählt werden.

                  Kommentar


                  • #39
                    protestix Okay, ich habe mich dafür entschieden, den Raum auch noch mit abzuspeichern. Wie mache ich das jetzt am besten in meinem INSERT, dass ein Raum genommen wird, der frei ist?

                    Kommentar


                    • #40
                      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
                      mit einbeziehen.

                      Kommentar


                      • #41
                        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)
                                )"
                        Welcher Raum belegt wird ist an sich egal, Hauptsache der gleiche nicht mehrfach.
                        Und die Raumbelegung soll komplett automatisch erfolgen.
                        Der Benutzer soll buchen können, und ihm wird in der Datenbank automatisch ein Raum zugewiesen.

                        Kommentar


                        • #42
                          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


                          • #43
                            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

                            Lädt...
                            X