2012-02-14 10 views
0

私は、毎月第1日の午前12時1分(つまり真夜中)に動作する「MonthlySal」というイベントスケジューラーを持っています。しかし、同じイベントは、特定の月には機能しません。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(); 

そして私は月が4月でない場合、イベントの本体を実行している条件文を、維持する考え。これは正しい方法ですか?いずれかが私にこれを解決する適切な方法を提案することができます、

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) –

+1

IF MONTH ISイベントの本体を実行しないでください。 – phpLearner

+0

これを質問してください... –

答えて

0

MySQLでは、間隔ではなく、crontabのような特定の条件で動作するイベントを作成する方法はありません。したがって、毎月の間隔から特定の月を除外する特別な方法はありません。

コードでは、プロシージャの実行を除外できるアプローチは正しいものです。もう1つは、必要とする毎月同じ手順(予定)をスケジュールすることです。しかし、それは将来的に多くの出来事を生み出し、必要な変更があれば、維持するのが難しいことが分かります。

ので、中・コードのアプローチは、次のようになります。

updateSal()
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(); 

私は

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

私の提案はではなく、その後の手順でロジックを追加することですを追加することをお勧めイベントは単純な事実から来ます。このロジックを実行する条件は、イベントではなくロジック自体に密接に関連しています。このイベントはの実行予定者に過ぎず、過大な論理を持つべきではありません。すべてのロジックと実行条件を1か所で保持する限り、ジョブの設計を簡素化します。さらに、その条件を拡張して、たとえばアプリケーションによって編集されるテーブルを使用することができます。これにより、管理者はMySQL定義を変更せずに条件を変更することができます。

+0

ok ..しかし、私はロジック(代替)に従うものとします。 IF月(curdate())== 'APRIL' THEN - 大雑把に言って私はupdateSal()を呼び出しました。 END IF END – phpLearner

関連する問題