phpbar.de logo

Mailinglisten-Archive

[php] [Kalender] Termin Wiederholung

[php] [Kalender] Termin Wiederholung

Boris Penck listen at gamate.com
Die Okt 28 11:43:36 CET 2003


> hackfrag at ff-scene.de wrote:
>> Guten Morgen,
>> ich programmier hier gerad ein Termin Kalender.
>> Nun hab ich folgendes Problem, ich möchte das man beim eintragen von
>> Terminen sagen kann das sich dieser Termin wiederholt (
>> täglich,wöchentlich,monatlich,jährlich ). 
>> Nun hab ich das folgendermaßen gelöst:
>> 
>> - Termin wird eingetragen am 6.Oktober 2003
>>   (Termin wiederholt sich jede Woche Montag)

Vielleicht hilft dieser Ansatz eines SQL Queries:

Feld Repetition:

1 == Wiederholung an jedem Wochentag X
2 == Wiederholung an jedem Tag X im Monat
3 == Wiederholung jählich am Tag X des Monats Y
4 == Wiederholung Vierteljährlich an Tag X
5 == Einzelner Termin, keine Wiederholung
6 == Wiederholung an jedem Wochentag
7 == Wiederholung Halbjährlich
(... Erweitern nach belieben)

$datum beinhaltet ein Syntaktisch korrektes Datum im Format YYYY-MM-DD

Die Tabellenfelder "start" und "ende" sind im datetime Format

Nur so als Beispiel:

SELECT appTitel, appId,
UNIX_TIMESTAMP(start) AS date_starts,
UNIX_TIMESTAMP(ende) AS date_ends
FROM termine
WHERE 
(start LIKE '".addslashes($datum)."%."' or
  (
    start <= '".addslashes($datum)." 00:00:01' and
    repetition = '1' and
    DAYOFWEEK(start) = DAYOFWEEK('".addslashes($datum)."')
  ) or (
    start <= '".addslashes($datum)." 00:00:01' and
    repetition = '2' and
    DAYOFMONTH(start) = DAYOFMONTH('".addslashes($datum)."')
  ) or (
    start <= '".addslashes($datum)." 00:00:01' and
    repetition = '3' and
      (
        MONTH(start) = MONTH('".addslashes($datum)."') and
        DAYOFMONTH(start) = DAYOFMONTH('".addslashes($datum)."')
      )
  ) or (
    start <= '".addslashes($datum)." 00:00:01' and
    repetition = '4' and
    (
      DAYOFMONTH(start) = DAYOFMONTH('".addslashes($datum)."') and
      MONTH(start)%4 = MONTH('".addslashes($datum)."')%4
    )
  ) or (
    start <= '".addslashes($datum)." 00:00:01' and
    repetition = '5'
  ) or (
    start <= '".addslashes($datum)." 00:00:01' and
    repetition = '6' and
    DAYOFWEEK('".addslashes($datum)."') >= '2' and
    DAYOFWEEK('".addslashes($datum)."') <= '6'
  ) or (
    start <= '".addslashes($datum)." 00:00:01' and
    repetition = '7' and
    (
      DAYOFMONTH(start) = DAYOFMONTH('".addslashes($datum)."') and
      MONTH(start)%6 = MONTH('".addslashes($datum)."')%6
    )
  )
) [and|or] [.. Weitere Konditionen]
ORDER BY UNIX_TIMESTAMP(ende) - UNIX_TIMESTAMP(start) DESC

In dem Fall trägt man nur den ersten Termin ein und ein zweites Feld
gibt an um welchen Wiederholungstyp es sich handelt. s.o.

Gruß
-boris


php::bar PHP Wiki   -   Listenarchive