2011-02-01 9 views
0

記念日の月を処理するときにストアドプロシージャでいくつかの異なるロジックを実行しようとしています。 IF(anniversary = MONTH(x))を使用すると、1か月間しか処理されない場合でも正常に動作します。記念日の月が月の範囲内にあるかどうかをチェック

ただし、複数の月を処理する場合、記念月が開始月と終了月の間にある場合は、異なるロジックを実行する必要があります。 IF(anniversary BETWEEN MONTH(x) AND MONTH(y))は新年(9月〜1月)には適用されません。

現在、記念日フィールドはMONTH(contract_start)として生成されていますが、以前はMONTHNAME()を使用していました(理由は分かりません)。

anniversaryは、IF関数をより読みやすくするためにブール値にすることをお勧めします。

答えて

0

これはうまくいきました。アルゴリズムを擬似コードで書いたのは簡単だった 代わりにロジックを格納する関数を作成しましたが、必要に応じて式に変換するのはかなり簡単です。

BEGIN 
IF min != max 
THEN 
    IF YEAR(min) != YEAR(max) 
    THEN 
     IF MONTH(born) BETWEEN MONTH(min) AND 12 
     OR MONTH(born) BETWEEN 1 AND MONTH(max) 
      THEN RETURN 1; 
      ELSE RETURN 0; 
      END IF; 
     ELSEIF MONTH(born) BETWEEN MONTH(min) AND MONTH(max) 
      THEN RETURN 1; 
      ELSE RETURN 0; 
     END IF; 
    ELSEIF MONTH(born) = MONTH(min) 
    THEN RETURN 1; 
    ELSE RETURN 0; 
END IF; 
END 
関連する問題