PHP/MySQLを使用して、悪名高い反復イベントのカレンダーに出ようとしています。私は最終的にはうまくいくものを見つけました。私はanswer hereを見つけましたが、少し難しかったです。カレンダーのイベントといくつかの最終的な計算を繰り返す
私の最初のテーブル 'events'。
私の2番目のテーブル 'events_metaは、繰り返しデータを格納します。 REPEAT_STARTはUnixタイムスタンプのような時間がないと日付された状態で
ID event_id meta_key meta_value
1 1 repeat_start 1336312800 /* May 7th 2012 */
2 1 repeat_interval_1 432000 /* 5 days */
、及び間隔間の秒の量をREPEAT_INTERVAL(432000は5日です)。
私は上記のリンクから少し変更した以下のMySQLを持っています。下記のタイムスタンプ(2012年5月12日の1299132000)は、時間のない現在の日付です。上記MySQLでは
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
、次のコードは、現在の日付からREPEAT_STARTフィールド(EM1.'meta_value'
)を控除した後、リピート間隔フィールド(EM2.'meta_value'
)で除算。
ELSE (1336744800 - EM1.`meta_value`)/EM2.`meta_value`
OR
TODAYS DATE - START DATE/5 DAYS
ので、ここで数学です:完璧な作品
1336744800 - 1336312800 = 432000
432000/432000 = 1
今は。私は17日マット2012で1336312800に5日後に控え、現在のタイムスタンプを変更した場合でも、それが見えます。このようなビット:
1336312800 - 1336312800 = 864000
86400/432000 = 2
それが2に等しいとMySQLで、それは1に等しくする必要があるため、動作しません。だから私の質問は、MySQLにこれをしなくても全体の番号を認識させるにはどうすればいいのでしょうか?
...
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,....)
希望は私が意味を作っていると私はそれだけの単純な数学の事やMySQLがあなたの助け:)それが役立つ感謝を持っている機能ですね!
EDIT:ANSWER以下@eggypalする
おかげで、私は私の答えを見つけて、もちろんそれは簡単でした!
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
タイムスタンプと1日の固定秒数に基づく日付の計算は、夏時間に影響します。 – DCoder
良いコール@DCoder。私はすべての時間をGMTとして保存し、次にCONVERT_TZ関数を使用して 'repeat_start'日付を決定します。上記のコード例にはこの余分なコードは含まれていません。私はそのトリックを正しく行うべきだと思いますか? –
あなたのお問い合わせで、指定された開始日と終了日の結果が表示されますか? '1336744800'は特定の日のようです:( –