我想在PHP/MySQL的日曆上臭名昭着的重複事件。我終於找到了一些似乎可行的東西。我找到了我的answer here,但我有點困難。重複日曆事件和一些最終的數學
我的第一個表'活動'。
ID NAME
1 Sample Event
2 Another Event
我的第二張'events_meta存儲重複數據。
ID event_id meta_key meta_value
1 1 repeat_start 1336312800 /* May 7th 2012 */
2 1 repeat_interval_1 432000 /* 5 days */
隨着repeat_start是沒有與時間作爲Unix時間戳的日期,並在幾秒鐘的時間間隔REPEAT_INTERVAL之間的量(432000是5天)。
然後我有以下的MySQL,我從上面的鏈接稍微修改。下面使用的時間戳(1299132000即2012年5月12日)是當天沒有時間。
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
在上述的MySQL,下面的代碼減去從當前日期的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
現在可以完美運行。但是,如果我改變當前時間戳提前5天至1336312800這是17席2012年,它看起來有點像這樣:
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的函數,這將有助於:)感謝您的幫助!
編輯:答案
得益於以下@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
基於時間戳的日期數學和一天中的固定秒數將在夏令時中斷。 – DCoder
Good call @DCoder。我將所有時間存儲爲GMT,然後使用CONVERT_TZ函數來確定「repeat_start」日期。上面的代碼示例不包含這個額外的代碼。我認爲這應該是對的嗎? –
您的查詢將允許我查看給定開始日期和結束日期的結果嗎? '1336744800'看起來像一個特定的日子:( –