Alexander, W.: Zeitperioden vergleichen (del: mit MySQL und PHP...)

Beitrag lesen

Hallo Chris,

Datumsangaben sollten normalerweise nicht auseinander gerissen werden, aber hier bleiben vermutlich keine anderen Möglichkeiten. DATETIME bspw. würde es zwar auch erlauben, den Year-Part auf 9999 zu setzen, damit könnte man eine „Wildcard“-Jahresangabe zwar auch umsetzen (wer hat Angst vor Y10K?) - aber für den Monat gibt's nichts vergleichbares.

Ich bin an das DB-Design nicht gebunden und kann (wenn überzeugt) eine andere Variante wählen. Gern auch die mit "varmonth" und "varyear" Spalten. Da im Moment die Berechnung mit Daten innerhalb von DB nicht möglich scheint, halte ich die aktuelle Speicherung für sinnvoll bzw. nutzbar. Ob man eine Jahreszahl mit "YEAR()" oder direkt über "begin_year" bekommt spielt im Moment keine Rolle.

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

2 | 15.12.2010 - 15.01.2011 (über Silvester)
3 | 10.06.* - 20.09.* (gilt für jedes Jahr)

Hier musst du dir aber überlegen, wie du eine Eindeutigkeit rein bringst.
Ist das nur vom 10.6. eines Jahres bis zum 20.09. des gleichen Jahres - oder kann/darf eine darauf „passende“ Suchperiode auch vom 10.6.2007 bis zum 20.09. 2015 gehen ...?
Hier könnte man ggf. noch verlangen, dass das Jahr bei beiden Referenz-Datümern das gleiche sein soll - aber das haut beim Beispiel darüber (oder den später folgenden Beispielen #6 und #7) schon nicht mehr hin, wenn dort das Jahr auch mal auf beiden Seiten „*“ sein sollte.

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

Auch hier wieder - nur die jeweils gleichen, oder auch vom 10.4. bis zum 20.08.?

Hier bin ich mit meiner Beschreibung in der Tat nicht vollständig gewesen. Das * soll folgendermaßen interpretiert werden:

Jahr = *, dann ist Jahr normalerweise an beiden Stellen gleich. Vorausgesetzt die Periode lässt sich gültig auf ein Jahr anwenden. D.h. wenn man das selbe Jahr "angenommen" hat, soll "begin" VOR dem "end" liegen. Ist dies nicht der Fall, dann ist das Endjahr (über Silvester) um 1 größer als Anfangsjahr bzw. Anfangsjahr um 1 kleiner als das Endjahr. Das gleiche gilt für die Monate.

GENERELL lautet die Regel folgendermaßen: die Sternchen sind so zu ersetzen, dass eine möglichst kleine Zeitperiode entsteht.

4 | 10.*.* - 20.*.* = 10 bis 20 April, 10 bis 20 Mai, 10 bis 20 Juni eines Jahres.

Wenn man jedoch

8 | 20.*.* - 10.*.* anwendet, dann sieht die Sache ganz anderes aus: 20 bis 10 Juni eines Jahres .... 20 Dezember bis 10 Januar (+ 1 Jahr) - 20.12.2010 bis 10.01.2011.

Ich denke, obige Fragen müssen erst mal geklärt bzw. dafür eine Definition gefunden werden, bevor du weiter machen kannst.

Zurzeit berechne ich alles in PHP, was diese Aufgabe angeht. D.h. eine Periode wird über die andere "geschoben" und Daten verglichen. Die Funktion ist jedoch verbugt und liefert nicht immer korrekte Ergebnisse. Um die 10x oder 100x "if's" zu ersparen suche ich eine generelle Lösung.

Ich bedanke mich für das Mitdenken.

Gruß Alexander.