2012-02-14 15 views
0

我有一個事件調度程序,名爲'MonthlySal',它將在每個月的第一天上午12:01(即午夜)工作。但同一事件不應在指定的幾個月內運行。mysql的事件調度程序不應該在特定的月份工作

示例:4月份的活動「MonthlySal」不應在4月份運行。

CREATE EVENT MonthlySal 
ON SCHEDULE EVERY 1 MONTH STARTS '2011-01-01 00:02:00' + interval 0 minute 
DO 
call updateSal(); 

我想保留一個條件語句,那就是如果MONTH不是APRIL那麼執行事件的主體。這是對的嗎?

也就是說,

CREATE EVENT MonthlySal 
ON SCHEDULE EVERY 1 MONTH STARTS '2011-01-01 00:02:00' + interval 0 minute 
DO 
BEGIN 
    IF month(curdate()) == 'APRIL' THEN -- roughly I have written 
     call updateSal(); 
    END IF 
END 

請可以在任何一個建議我解決這個正確的方法。

+0

[你到目前爲止嘗試過什麼??](http://mattgemmell.com/2008/12/08/what-have-you-tried) – 2012-02-14 11:23:08

+1

我想保留一個條件語句,那就是IF MONTH IS不是4月然後執行事件的主體。 – phpLearner 2012-02-14 11:31:04

+0

解答此問題...... – 2012-02-14 11:32:27

回答

0

在MySQL中,沒有辦法創建一個不會間隔工作的事件,但是在給定的條件下,如crontab可以。因此,沒有特定的方法可以從每個月的時間間隔中排除某個月份。

一種在代碼中可以排除過程執行的方法是正確的。另一個是爲每個需要的月份安排相同的程序(事件)。但是,這將在未來造成大量事件,並且如果需要進行任何更改,肯定會證明難以維持。

所以,一個在代碼的做法是:

CREATE EVENT e_salary 
    ON SCHEDULE 
     EVERY 1 MONTH STARTS '2012-03-01 00:00:00' 
    COMMENT 'My event to do something with salaries' 
    DO 
     CALL updateSal(); 

updateSal()我建議增加

IF (MONTH(CURDATE()) = 4) 
THEN 
    //some code you already have 
END IF; 

我的建議是添加邏輯程序而不是在事件來自簡單的事實,何時執行這個邏輯的條件與邏輯本身緊密相關,而不是事件。該事件僅僅是一個安排的執行者,它不應該有它自己的過度邏輯。只要你將所有的邏輯和運行條件保存在一個地方,它將簡化工作的設計。此外,您可以擴展該條件,例如,使用將由應用程序編輯的表,這樣管理員就可以在不修改MySQL定義的情況下更改條件。

+0

好的。但我應該遵循邏輯(替代)。 IF month(curdate())=='APRIL'THEN - 大致上我寫過調用updateSal(); END IF END – phpLearner 2012-02-15 01:56:37