2012-02-14 36 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

相关问题