2012-05-11 70 views
12

我想在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 
+1

基於時間戳的日期數學和一天中的固定秒數將在夏令時中斷。 – DCoder

+1

Good call @DCoder。我將所有時間存儲爲GMT,然後使用CONVERT_TZ函數來確定「repeat_start」日期。上面的代碼示例不包含這個額外的代碼。我認爲這應該是對的嗎? –

+0

您的查詢將允許我查看給定開始日期和結束日期的結果嗎? '1336744800'看起來像一個特定的日子:( –

回答

10

這不是完全清楚你想要什麼你的查詢,但你的問題的JIST讓我朝着建議你看看模運算瘦:在SQL,a % b返回a除以b - 如果沒有餘數(即a % b = 0),則a必須是的確切倍數b

在你的情況,我覺得你想找到的事件,其中事件之間的時間啓動,並給出一些文字是事件間隔的整數倍:那就是,(literal - event_start) % event_interval = 0。如果它不是零,則該值是在literal之後的下一次出現的時間(並且因此確定下一次出現是否發生在一段時間內,例如一天中,將測試以查看餘數是否小於這種常數,例如(literal - event_start) % event_interval < 86400)。

如果這不是你所追求的,請明確說明你的查詢想要達到什麼目的。

+0

這就是訣竅!我設法讓它在PHP中工作: 'echo((strtotime('2012-05-22 00:00:00') - 1336312800)%432000);'我試過在MySQL中使用'%'但它不起作用。它們是否等價? –

+0

對不起,忽略我最後的評論,它的工作!我將編輯我的原始帖子與最終的代碼,以幫助其他人:) –

+0

我開始追蹤它,並失敗。幫我。 http://stackoverflow.com/questions/20286332/display-next-event-date – Billa

相關問題