Ankündigung

Einklappen
Keine Ankündigung bisher.

vergleichen unbeschränkt vieler Zeitspannen auf Überschneidung

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

  • vergleichen unbeschränkt vieler Zeitspannen auf Überschneidung

    Hallo zusammen,

    ich schreibe z.Zt. ein Plugin für Wordpress. Dort wird per Formular ein Datenbankeintrag mit einer Uhrzeit und Länge(in Stunden, INT) gesetzt. Jetzt möchte ich, dass angezeigt wird, sobald sich 4 dieser Zeiträume überschneiden.
    Folgendes habe ich schon:
    PHP-Code:
    $dat date('Y-m-d');
    $res $wpdb->get_results"SELECT zeit, laenge FROM $table_name WHERE datum = '" esc_sql($dat) . "'") or die(mysql_error());
    foreach ( 
    $res as $result ) {
                
    $startzeit    $result->zeit;
                
    $endzeit    date'H:i:s'strtotime$result->zeit ) + $result->laenge*3600);
            } 
    Ich dachte mir, ob es evtl sinnvoll wäre, ein Array daraus erstellen zu lassen, und diese dann zu vergleichen. Aber da würden sich ja alle miteinander vergleichen...
    Über jeden Denkanstoß wäre ich dankbar.


  • #2
    Ich versteh nicht genau, was ist deine Frage? Ob sich zwei Zeiträume überschneiden kann man prüfen, ja. Aber was ist mit 4? Woher kommen die wenn man in dem Form nur einen eingeben kann etc..

    Info:

    PHP-Code:
    $endzeit    date'H:i:s'strtotime$result->zeit ) + $result->laenge*3600); 
    Du kannst hier auch einfach die relativen Ausdrücke verwenden zB '+4 hours'

    Ev. hilft dir ja das hier. Da gibt es auch etwas für Überschneidungen und relative Ausdrücke. https://php-de.github.io/jumpto/date...time-erstellen
    Das kann man aber auch die DB prüfen lassen. etc etc...
    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      Per Formular wird immer nur einer eingegeben, das ist richtig. Aber auf einer anderen Seite möchte ich eine Ausgabe haben, wenn sich 4 Zeiträume (unterschiedliche Zeilen in der DB) überschneiden.
      Btw: Danke für den Tipp mit der relativen Ausdrücken.

      Kommentar


      • #4
        Bedenke auch gerade bei Neuimplementationen den year 2k38 Bug: https://www.phpgangsta.de/tag/2038-bug

        Deswegen tunlichst immer DateTime verwenden.

        Kommentar


        • #5
          Zitat von JohnHSmith Beitrag anzeigen
          ...möchte ich eine Ausgabe haben, wenn sich 4 Zeiträume (unterschiedliche Zeilen in der DB) überschneiden.
          Und woher weisst du welche Zeilen das sind.

          Kann man sich das so vorstellen:
          Code:
          Eingabe vom Formular
          $_GET['time']    $_GET['period']
          22:00            4h
          
            | - - - - |
          22:00      2:00
          
            | - - | - - - - - |
          22:00  0:00        6:00
          Dann siehst du schon das Problem. die Zeiträume gehen in den nächsten Tag.
          Und was heisst überschneiden, berührend, innerhalb. "vom Start bis" oder auch "vom Ende ab", da gibt es so viele Varianten.
          Was genau willst du testen, Buchungen, Termine oder um was geht es genau.
          Ein SQL-Dump deiner Tabelle und ein wenig mehr Infos wären generell zur Problembeschreibung hilfreich.


          Kommentar


          • #6
            Am Rande:
            Der Hinweis DateTime zu benutzen ist richtig. Doch nicht aus dem genannten Grund.
            Denn der year 2k38 Bug hat sich für die Masse aller Plattformen bereits heute erledigt, da dort 64-bit Systeme laufen die 8-Byte signed Integers nutzen.
            PHP Online Sandbox
            PHP-Klassen auf github

            Kommentar


            • #7
              Hab mal den Code überarbeitet, hoffe das sind infos genug. Mit Überschneiden meine ich den fall, das 4 Zeitpunkte genau übereinanderliegen. Nicht die ganze Zeit, aber zumindest zu einem gewissen Teil.

              Kommentar


              • #8
                Zitat von jspit Beitrag anzeigen
                Am Rande:
                Der Hinweis DateTime zu benutzen ist richtig. Doch nicht aus dem genannten Grund.
                Denn der year 2k38 Bug hat sich für die Masse aller Plattformen bereits heute erledigt, da dort 64-bit Systeme laufen die 8-Byte signed Integers nutzen.
                PHP Online Sandbox
                Erledigt ist was anderes. 64 Bit verschiebt das Problem nur.

                Kommentar


                • #9
                  Die Zeilen kommen also aus der Einschränkung des Datums, das ist ja schon mal was.
                  Jetzt hast ja keinen Endpunkt sondern lediglich einen Startpunkt und einen Zeitrahmen, das heisst du musst erst mal den Endpunkt als Zeit ermitteln.
                  10:00 Uhr plus 4 Stunden ergibt 14 Uhr
                  Das geht mit dateadd und interval
                  Das gleiche machst du mit den Zeiten in der Tabelle, die du vergleichen willst.
                  Danach prüfst du ob Endzeit_Formular kleiner als Startzeit Tabelle ist und ob Startzeit_Formular grösser als Endzeit Tabelle ist.

                  Schematisch sieht das so aus:
                  Code:
                  Formulardaten
                    |- - - - - - - - - | - - - - | - - - - - - - - - |
                   0:00              10:00     14:00                0:00
                                     Start     Ende
                  
                   Tabellenvergleich
                    |- - - - - | - - - | - - - - - - - - - - - - - |
                   0:00       6:00    10:00                       0:00  
                              Start   Ende
                  
                    |- - - - - - - - - - - - - - | - - - | - - - - |
                   0:00                        14:00   18:00      0:00
                                               Start   Ende
                  Das funktioniert solange, wie die Endzeiten nicht in den nächst Tag reinlaufen.



                  Kommentar


                  • #10
                    Den Endzeitpunkt habe ich ja in meiner foreach-schleife schon herausgefunden. Und das was du beschrieben hast betrifft ja nur 2 Zeitrahmen, ich bräuchte das aber für 4

                    Kommentar


                    • #11
                      Na wenn du dir eine Funktion geschrieben hast die 2 "Zeiträume" miteinander vergleicht spricht doch nichts dagegen das auf beliebig viele anzuwenden?

                      Kommentar


                      • #12
                        Das was ich beschrieben habe betrifft eine DB-Abfrage, wie viele Datensätze davon betroffen sind ist dann egal, weil das Ergebnis ja dadurch gefiltert wird.

                        Kommentar


                        • #13
                          Ich fürchte, du kommst nicht umhin, jede Zeitspanne mit allen anderen zu vergleichen. Dazu mal folgendes Beispiel als Pseudografik:
                          Code:
                          1|----------
                          2|                 --------
                          3|                            --------
                          4|              ---------
                          5|  ------
                          6|                 ----
                          7|---
                          8|                           ----
                          9|              ----
                          Hier sind es die Einträge 2,4,6 und 9 die sich 4-fach überschneiden. 1,5 und 7 nur 3-fach.

                          Bevor ich weiter aushole die Frage, sehe ich dein Problem richtig?
                          PHP-Klassen auf github

                          Kommentar


                          • #14
                            jspit genau. das ist die Sache.

                            Kommentar


                            • #15
                              Grob sehe ich folgenden Lösungsweg:
                              - Für jedes Zeitintervall wird mit jeden anderen Zeitintervall die Schnittmenge berechnet
                              - existiert eine Schnittmenge, dann wird ein Schnittmengenzähler erhöht und es wird mit der neuen Schnittmenge der Vergleich fortgesetzt
                              - existiert keine Schnittmenge, dann wird der Vergleich mit der letzten Schnittmenge fortgesetzt
                              - erreicht der Schnittmengenzähler den vorgegeben Level (hier 4), wird abgebochen und True oder was auch immer zurückgegeben.
                              - läuft die Routine durch ohne das Level zu erreichen wird false geliefert

                              PHP-Klassen auf github

                              Kommentar

                              Lädt...
                              X