PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : MySQL Intervalle



malburg
13-12-2004, 19:46
Hallo,

ich zerbreche mir hier den Kopf wie man folgendes realisieren kann.


also ich habe eine event tabelle mit folgenden spalten

event_id (int auto_inc prim_key), start_date (date), end_date (date), description

und jetzt zum prob.

also nehmen wir an, das der user alle events vom 01.10 - 01.12 augelistet haben möchte, dann brauch ich ja nur das start_date vergleichen und komme zum ergebnis.

aber nun habe ich das problem, das es bei mir auch events gibt, die z.b regelmässig (z.b. am ersten montag im monat, oder am 4 freitag im monat, oder am letzten freitag im monat) sind.

ich hab da echt keine idee, wie man sowas in der datenbank speichern kann und dann auch wieder mit select auslesen kann ?

mir steht eine mysql datenbank zur verfügung und auch php.


vielleicht hat einer von euch eine idee !

vielen dank im vorraus

m alburg

quinte17
14-12-2004, 08:47
also ich habe eine event tabelle mit folgenden spalten
event_id (int auto_inc prim_key), start_date (date), end_date (date), description

also nehmen wir an, das der user alle events vom 01.10 - 01.12 augelistet haben möchte, dann brauch ich ja nur das start_date vergleichen und komme zum ergebnis.


nur mal hypotetisch:
der user möchte den zeitraum vom 01.05. bis 02.05. haben.
es gibt jetzt 3 möglichkeiten was in dem bereich alles drinliegen kann:
1: 02.04. - 01.05. // fängt vorher an
2: 01.05. - 02.05. // liegt mittendrin
3: 02.05. - 05.05. // endet später

bei 2. und 3. ist deine aussage korrekt, aber 1. taucht nicht im result auf, obwohl es der user vielleicht auch sehen will (überschneidet sich ja auch mit dem zeitraum)

dies kann man aber zum beispiel so lösen:

select * from tabelle
where start_date <= "übergebenes Ende Datum"
and end_date >= "übergebenes Start Datum"

bei uns in der firma haben wir ein gleichwertiges problem wie du hier hast. bei uns wurde es so gelöst, dass diese einträge (jeder freitag, jeder 2. mittwoch) von einem programm regelmäßig erzeugt werden. ist vielleicht nicht "die" lösung, da man somit nicht allzusehr in die zukunft sehen kann, aber für unsere bedürfnisse war dies vollkommen ausreichend.

leider kann ich dir nicht mehr hilfe geben... vielleicht kommst du ja noch auf eine relativ gute lösung des problems ;)

cu
quinte17

malburg
14-12-2004, 08:53
ja, das mit dem script is ja ok, aber so will ich es ja nicht, da das ja ne webseite werden soll. also muss die abfrage on the fly abgearbeitet werden.

trotzdem erst ma danke

m alburg.

Joghurt
14-12-2004, 16:15
Ich würde die Tabelle um zwei integer Felder erweitern:
1. einen Interval-Wert, der angibt, in welchem Abstand sich ein Termin wiederholt (ich habe ihn ival genannt)
2. einen Längen-Wert, der angibt, wie oft der Termin jedesmal dauert (length bei mir)

Beispiel: Jeden 7. Tag, ganztägig => interval=7, length=1
Jeden 30. Tag (Monate korrekt zu implementieren überlasse ich dir ;) z.B. könntest du 2 weitere Monatsintervall, -längen Felder einbauen und in die Abfrage noch ein TO_MONTH hineinpfriemeln), 2 Tage lang => interval=30, length=2

Bei "normalen", einmaligen Terminen müssen interval=length=1 sein.

Start und Ende geben die Laufzeit an, bei "ewigen Terminen" kannst du als ende ja 9999-12-31 nehmen.

Dann kannst du mit der Abfrage

SELECT * FROM Tabelle
WHERE datum BETWEEN Start AND End
AND DATEDIFF(datum,Start)%ival < length; die gewünschten Termine bekommen.

DATEDIFF gibt es erst ab MySQL 4.1, ggf. durch TO_DAYS(b)-TO_DAYS(a) ersetzen.

HTH