正規化プロセスについて、以下にさらに丁寧に説明します。
ソースのdate_expressionまたはtimestamp_expressionのDAYフィールドが、結果のターゲットDAYフィールドよりも大きい場合、ADD_MONTHSはDDを、その月の最後の日付+nに設定して、レポートされる日付またはタイムスタンプを正規化します。
分かりやすくするため、date_expressionを'YYYY-MM-DD'と定義します。
与えられたdate_expressionに対して、ADD_MONTHSの構文を次のように表現できます。
ADD_MONTHS('YYYY-MM-DD' , n)
nが負の数にもなりうることに留意してください。また、次に示すように、date_expressionに対して'YYYY-MM-DD'を代用して、ADD_MONTHSをANSI SQL:2011の日付および間隔の形に再定義することができます。
ADD_MONTHS('YYYY-MM-DD', n) = 'YYYY-MM-DD' ± INTERVAL 'n' MONTH
この等式は1999-09-31のような有効でない日付でない限り真です。有効でない日付の場合は、ANSI式は有効でない日付例外をトラップしてエラーを戻します。
一方、ADD_MONTHSは、例外を処理して有効な日付を戻しますが、それは必ずしも、期待された日付ではないかもしれません。ADD_MONTHSが使うアルゴリズムは、その正規化された結果を生成し、次のような擬似コードとして表わします。
WHEN DD > last_day_of_the_month(MM+n) THEN SET DD = last_day_of_the_month(MM+n)
この特性は、任意のtimestamp_expressionの日付部分にも当てはまります。
正規化により、うるう年に対しても有効な結果が生成されます。