Bademeister: Zeitperioden vergleichen mit MySQL und PHP + Zend Framework

Beitrag lesen

Hi.

Ich hab da erstmal ein paar Fragen:

Ein paar Beispielperioden für bessere Interpretation (Zahl am Anfang ist eine ID):

3 | 10.06.* - 20.09.* (gilt für jedes Jahr)

Was bedeutet das? Das '*' vorne und hinten müssen dasselbe Jahr sein? Oder können es auch verschiedene Jahre sein (was unsinnig wäre, weil dann der Datensatz auf jedes im Formular eingegebene Datum passen würde, also eher ne rhetorische Frage)?

6 | 10.11.* - 30.03.* (über Silvester und jedes Jahr)

Und das hier gilt dann für jedes '*' vorne und '*+1' hinten? Dass beide * beliebig gewählt werden können, wäre wiederum unsinnig. Wenn ich bis hierhin richtig liege, wirft das aber weitere Fragen auf:

  • Dein Datenbankdesign ermöglicht es nicht, einen Zeitraum anzugeben, der sich jährlich wiederholt, aber länger als ein Jahr ist. Ist das so gedacht?

4 | 10.*.* - 20.*.* (gilt für jeden Monat und jedes Jahr)

  • Heißt das hier nun auch, dass die Monate vorne und hinten identisch sein müssen? Oder kann ich auch vorne ne 8 und hinten ne 3 als Monat einfügen und dann wieder die Jahreszahlen wie oben auf etwa 2008 vorne und 2009 hinten setzen?

Du solltest dringend darüber nachdenken, das Design der Datenbank dahingehend zu ändern, dass Du Start- und Enddatum als echtes Datum speicherst, und in einer weiteren Spalte die "Frequenz" der Wiederholung: "monatlich/jährlich/keine Wiederholung". Denn mit Deinem Design müsstest Du erstmal haargenau(!) formulieren, was ein Datensatz überhaupt bedeutet - siehe die obigen Fragen.

Das angeregte Design wäre dabei leichter (weil eindeutig) zu interpretieren, und flexibler, weil die Wiederholungsintervalle nicht das Datenbankdesign beeinflussen - etwa wöchentliche Wiederholungen könnten ohne weiteres eingeführt werden, wenn gewünscht.

Es wird eine Formel (oder Algorithmus) gesucht, die alle Perioden (aus der Datenbank) findet, die für (im Webformular) angegebene Periode passend sind. Praktisch also bekommt die Formel bzw. Algorithmus die Periode aus dem Formular und soll in der DB "id’s" finden, die die gesuchte Periode beinhalten können.

Bei gegebenem Eingebeintervall:

Für jeden Datensatz: Nimm das Startdatum und addiere dazu die maximale Anzahl an Wiederhlungsintervallen (d.h. Monaten/Jahren/..., je nach "Wiederholungsfrequenz"), so dass das Ergebnis kleiner ist als das Startdatum des eingegebenen Intervalls.
Addiere dasselbe Intervall zum Enddatum des Datensatzes und prüfe, ob das Ergebnis größer ist als das Enddatum des Eingabeintervalls:
Ja   => Datensatz wird ausgewählt.
Nein => Datensatz wird nicht ausgewählt.

Für die Implementierung wirst Du es zu schätzen wissen, wenn Du es mit echten Daten zu tun und die Datumsfunktionen des DBMS zu Verfügung hast.

Viele Grüße,
der Bademeister