日付の算術計算

日付値は、減算、増分計算、または減分計算を行うことができます。

日付の減算: 別の日 (DATE1) から ある日 (DATE2) を減算した結果は、 その 2 つの日の間の年数、月数、および日数を指定する 日付期間となります。 結果のデータ・タイプは DECIMAL(8,0) です。 DATE1 が DATE2 以上の場合、DATE1 から DATE2 が減算されます。 これに対し、DATE1 が DATE2 より小さい場合は、DATE2 から DATE1 が減算され、結果の符号が負になります。 RESULT = DATE1 - DATE2 の演算のために行われる手順を、次に解説します。

日付の減算: RESULT = DATE1 - DATE2
  • DAY(DATE2) <= DAY(DATE1) であれば、DAY(RESULT) = DAY(DATE1) - DAY(DATE2)
  • DAY(DATE2) > DAY(DATE1) であれば、DAY(RESULT) = N + DAY(DATE1) - DAY(DATE2) ここで N = MONTH(DATE2) の最後の日。 MONTH(DATE2) に 1 が加えられる。
  • MONTH(DATE2) <= MONTH(DATE1) であれば、MONTH(RESULT) = MONTH(DATE1) - MONTH(DATE2)
  • MONTH(DATE2) > MONTH(DATE1)の場合、MONTH(RESULT) = 12 + MONTH(DATE1) - MONTH(DATE2)およびYEAR(DATE2)は 1 ずつ増分されます。
  • YEAR(RESULT) = YEAR(DATE1) - YEAR(DATE2)

例えば、DATE('3/15/2005') - 「12/31/2004」の結果は 215 (すなわち、0 年、2 カ月、15 日の期間) です。 この例で、 第 2 オペランドは日付に変換する必要がないことに注意してください。 SQLのDatetime演算で説明されている減算の規則の1つによると、第1オペランドが日付の場合、第2オペランドは日付の文字列表現とすることができます。

日付の増減: 日付に期間を足した結果、 あるいは日付から期間を引いた結果は、 それ自体が日付となります。 (この演算では、月はカレンダーのページに相当します。 つまり、日付に月を加算することは、その日付のページから順にカレンダーをめくっていくようなものです。) 結果は、0001 年 1 月 1 日以後 9999 年 12 月 31 日以前の日付となる必要があります。 年の期間を加算または減算する場合、影響を受けるのは日付の年の部分だけです。 月も日も変更されませんが、その結果がうるう年でない年の 2 月 29 日となった場合は別です。 ただし、結果がうるう年以外で 2 月 29 日になった場合には、結果の日 の部分は 28 に設定され、SQLCA の SQLWARN6 フィールドが W に 設定されます。これは、無効な日付を訂正するために、月末調整が 行われたことを示します。 SQLCAフィールドの説明には、 SQLWARN6 の設定方法も記載されています。

同様に、月の期間を加算または減算する場合、影響を受けるのは月の部分だけです。 ただし、必要に応じて年の部分にも影響が及びます。 日付の日の部分は変更されませんが、結果が無効な場合 (例えば 9 月 31 日など) は別です。 日は月の末日に設定され、調整が行われたことを示すために、SQLCA の SQLWARN6 フィールドが W に設定されます。

日の期間を加算または減算すると、日付の中の日の部分は当然影響を受けますが、月および年も影響を受ける可能性があります。 日の期間を加算または減算しても、月末調整は行われません。

日付期間の場合も、その値が正であっても負であっても、日付との加算および減算が 可能です。 ラベル付き期間の場合と同様に、結果は有効な日付となります。必要な 月末調整が行われたことを示す場合は、SQLWARN6 が W に設定されます。

正の日付期間が日付に加算されるとき、または負の日付期間が日付から減算されるときは、日付は、指定した年数、月数、日数の順で増分されます。 したがって、DATE1+X (X は DECIMAL(8,0) の正の数値) は次の式と同等です。
  DATE1 + YEAR(X) YEARS + MONTH(X) MONTHS + DAY(X) DAYS
正の日付期間を日付から減算するとき、または負の日付期間を日付に加算するとき、日付は、指定した日数、月数、年数の順で減分されます。 したがって、DATE1-X (X は DECIMAL(8,0) の正の数値) は次の式と同等です。
  DATE1 - DAY(X) DAYS - MONTH(X) MONTHS - YEAR(X) YEARS

ある日付に 1 カ月を加算すると、結果は 1 カ月後の同じ日となります。ただし、後の月に その日が存在しない場合は除きます。 この場合、結果の日は翌月の末日に設定されます。 例えば、1 月 28 日に 1 カ月を加算すると、結果は 2 月の 28 日になります。1 月 の 29 日、30 日、または 31 日に 1 カ月を加算すると、結果は 2 月の 28 日か、あるいは うるう年の 2 月 29 日になります。 特定の日付に 1 カ月以上の月数を加算し、その結果から同じ月数を減算した場合、最終的な日付が元の日付と同じになるとは限りません。

ある日付に 1 カ月以上の月数を足した後で、その結果から 同じ月数だけ引いた場合は、最終結果の日付が元の日付と同じ にならないこともあります。 また、論理的には等価な式が同じ結果を出さないことがあります。 例えば、次の 2 つの式の結果は同じにはなりません。
   (DATE('2005 01 31') + 1 MONTH) + 1 MONTH    -- results in 2005-03-28 
   DATE('2005 01 31') + 2 MONTHS               -- results in 2005-03-31
ラベル付き日付期間と日付との間の加算および減算の順序によって、結果に影響する可能性があります。 ある日付にラベル付き日付期間を加算する場合は、YEARS + MONTHS + DAYS という順序で指定してください。 ある日付からラベル付き日付期間を減算する場合は、DAYS - MONTHS - YEARS という順序で指定してください。 例えば、日付に 1 年と 1 日を追加する場合は、 以下のように指定します。
  DATE1 + 1 YEAR + 1 DAY
日付から 1 年、1 月、および 1 日を減算する場合は、 以下のように指定します。
  DATE1 - 1 DAY - 1 MONTH - 1 YEAR