2013-03-04 12 views
4

我正在制定運輸計劃。我的MySQL(i)/ PHP知識是(非常)基本的。MySQL:具有重複任務的運輸計劃員

我想顯示一個包含特定日期所有任務的HTML表格。 但問題是有些任務需要重複(直到我刪除整個任務),因此任務的頻率如下:一次,每天,每週,每兩週和每月。

因此,當我在星期一以每週頻率添加新任務時,每個星期一該任務必須返回到我的表中。

我應該結合起來是這樣的:

SELECT * FROM planner 
     WHERE frequency = `once` 
     AND date = CURDATE() 

SELECT * FROM planner 
     WHERE frequency = `daily/weekly/two-weekly/monthly/yearly` 
     AND day = DAYOFWEEK(CURDATE()) 
     AND date + INTERVAL 1 DAY/1 WEEK/2 WEEK/1 MONTH 

如果是的話,怎麼樣呢?

希望有人能幫助我。

編輯:

這一次,每天和每週的任務,這樣的查詢(可能還可怕)會做:

(SELECT * 
     FROM planner 
     WHERE frequency = 'once' 
     AND date = NOW()) 
UNION 
(SELECT * 
     FROM planner 
     WHERE frequency = 'daily' 
     AND date + INTERVAL 1 DAY) 
UNION 
(SELECT * 
     FROM planner 
     WHERE frequency = 'weekly' 
     AND day = DAYOFWEEK(CURDATE()) 
     AND date + INTERVAL 1 WEEK) 

雖然,對於「兩週刊」和「月」 INTERVAL + 2周/ 1個月,將返回結果周。如何解決這個問題?

編輯:

我不使用有效性colums在我的表,因爲我不知道過期/無效過去的任務。我將筆記本電腦的年份更改爲2040年,確實出現了mysql錯誤。我已經改變了計劃,我認爲重複任務一年有效,可以選擇刪除或延長一年。然後我也忘了提及,當我每個星期一創建一個任務時,每月都有一個任務,那麼任務會在下個月的第一個星期一返回到我的表中。當我嘗試你的解決方案時,我的桌面上每天都會出現「一次」頻率的任務。

EDIT

@SparKot,通常使用每月頻率任務被觀看時,例如,2013年3月5日,下一次將是2013年4月5日,2013年5月5日和等等。 雖然在這個規劃師的例子中設置了一個月度任務,週二2013-03-05應該在下個月的第一個週二(4月:2013-04-02,可能:2013-05-07,6月:2013-06)重新出現-04)。

+0

你不具備有效期爲'重複任務'?如果您忘記刪除無效任務會怎麼樣?請分享表架構,'show create table planner'。 – SparKot 2013-03-04 19:27:29

回答

2

假設有效力列在表:

SELECT * 
    FROM planner 
WHERE  now() >= valid_from 
     AND now() <= valid_to 
     AND (frequency = 'daily' 
      OR (frequency = 'once' AND date(now()) = date) 
      OR (frequency = 'weekly' AND 0 = (abs(datediff(now(), date)) % 7)) 
      OR (frequency = 'two-weekly' AND 0 = (abs(datediff(now(), date)) % 14)) 
      OR (frequency = 'monthly' 
       AND ceil(dayofmonth(now())/7) = ceil(dayofmonth(date)/7) 
       AND dayofweek(now()) = dayofweek(date)) 
      ); 

無有效期列:你可能會得到它尚未刪除過期/無效過去的任務:

SELECT * 
    FROM planner 
WHERE (frequency = 'daily' 
      OR (frequency = 'once' AND date(now()) = date) 
      OR (frequency = 'weekly' AND 0 = (abs(datediff(now(), date)) % 7)) 
      OR (frequency = 'two-weekly' AND 0 = (abs(datediff(now(), date)) % 14)) 
      OR (frequency = 'monthly' 
       AND ceil(dayofmonth(now())/7) = ceil(dayofmonth(date)/7) 
       AND dayofweek(now()) = dayofweek(date)) 
      ); 
+0

謝謝你的回答@SparKot!我沒有在表格中使用有效性列表,因爲我不知道過期/無效的過去任務。我將筆記本電腦的年份更改爲2040年,確實出現了mysql錯誤。我已經改變了計劃,我認爲重複任務一年有效,可以選擇刪除或延長一年。 – JK87 2013-03-05 11:16:43

+0

@ user2131419第一個問題在這裏,請閱讀做什麼[當你得到答案](http://stackoverflow.com/faq#howtoask)。 – SparKot 2013-03-05 11:28:44

+0

我的歉意@SparKot,我編輯了我的問題。 – JK87 2013-03-05 11:47:25