Wiederholte Kalenderereignisse und einige abschließende Berechnungen
Ich versuche, die berüchtigten wiederkehrenden Ereignisse auf Kalendern mit PHP / MySQL auszuprobieren. Ich habe endlich etwas gefunden, das zu funktionieren scheint. Ich habe meine gefundenantworte hier aber ich habe ein wenig Schwierigkeiten, es zu beenden.
Mein erster Tisch 'Events'.
<code>ID NAME 1 Sample Event 2 Another Event </code>
Meine zweite Tabelle 'events_meta', in der die sich wiederholenden Daten gespeichert sind.
<code>ID event_id meta_key meta_value 1 1 repeat_start 1336312800 /* May 7th 2012 */ 2 1 repeat_interval_1 432000 /* 5 days */ </code>
Wenn repeat_start ein Datum ohne Uhrzeit als Unix-Zeitstempel ist und repeat_interval eine Anzahl von Sekunden zwischen Intervallen (432000 sind 5 Tage).
Ich habe dann das folgende MySQL, das ich über den obigen Link leicht modifiziert habe. Der unten verwendete Zeitstempel (1299132000, 12. Mai 2012) ist der aktuelle Tag ohne Zeitangabe.
<code>SELECT EV.* FROM `events` EV RIGHT JOIN `events_meta` EM1 ON EM1.`event_id` = EV.`id` RIGHT JOIN `events_meta` EM2 ON EM2.`meta_key` = CONCAT( 'repeat_interval_', EM1.`id` ) WHERE EM1.meta_key = 'repeat_start' AND ( ( CASE ( 1336744800 - EM1.`meta_value` ) WHEN 0 THEN 1 ELSE ( 1336744800 - EM1.`meta_value` ) / EM2.`meta_value` END ) ) = 1 </code>
Im obigen MySQL wird mit dem folgenden Code das Feld repeat_start abgezogen (EM1.'meta_value'
) vom aktuellen Datum ab und dividiert es durch das Feld Wiederholungsintervall (EM2.'meta_value'
).
<code>ELSE ( 1336744800 - EM1.`meta_value` ) / EM2.`meta_value` </code>
ODER
<code>TODAYS DATE - START DATE / 5 DAYS </code>
Also hier ist die Mathematik:
<code>1336744800 - 1336312800 = 432000 432000 / 432000 = 1 </code>
Das funktioniert jetzt perfekt. Aber wenn ich den aktuellen Zeitstempel 5 Tage im Voraus in 1336312800 ändere, was 17. Mat 2012 ist, sieht es ein bisschen so aus:
<code>1336312800 - 1336312800 = 864000 86400 / 432000 = 2 </code>
Was nicht funktioniert, weil es 2 ist und in MySQL 1 sein muss. Ich schätze, meine Frage ist, wie ich MySQL dazu bringen kann, eine ganze Zahl zu erkennen, anstatt dies tun zu müssen.
<code>... WHERE EM1.meta_key = 'repeat_start' AND ( ( CASE ( 1336744800 - EM1.`meta_value` ) WHEN 0 THEN 1 ELSE ( 1336744800 - EM1.`meta_value` ) / EM2.`meta_value` END ) ) = IN (1,2,3,4,5,6,7,8,....) </code>
Hoffe, ich mache Sinn und ich hoffe, es ist nur eine einfache mathematische Sache oder eine Funktion, die MySQL hat, die helfen wird :) Vielen Dank für Ihre Hilfe!
EDIT: DIE ANTWORT
Dank @eggypal unten habe ich meine Antwort gefunden und natürlich war es einfach!
<code>SELECT EV.* FROM elvanto_calendars_events AS EV RIGHT JOIN elvanto_calendars_events_meta AS EM1 ON EM1.`event_id` = EV.`id` RIGHT JOIN elvanto_calendars_events_meta AS EM2 ON EM2.`meta_key` = CONCAT( 'repeat_interval_', EM1.`id` ) WHERE EM1.meta_key = 'repeat_start' AND ( ( 1336744800 - EM1.`meta_value` ) % EM2.`meta_value`) = 0 </code>