labeled-duration |--+-function------+---+-YEAR---------+-------------------------| +-(expression)--+ +-YEARS--------+ +-constant------+ +-MONTH--------+ +-column-name---+ +-MONTHS-------+ '-host-variable-' +-DAY----------+ +-DAYS---------+ +-HOUR---------+ +-HOURS--------+ +-MINUTE-------+ +-MINUTES------+ +-SECOND-------+ +-SECONDS------+ +-MICROSECOND--+ '-MICROSECONDS-'
ラベル付き期間 (labeled-duration) は、特定の時間単位を表すもので、 数値 (式の結果でも可) の後に 7 つの期間キーワード YEARS、MONTHS、DAYS、 HOURS、MINUTES、SECONDS、 または MICROSECONDS 33 のうちの 1 つを付けたものです。 指定した値は、DECIMAL(15,0) の数値へ割り当てられる場合と同様に変換されます。 ラベル付き期間は、算術演算子の 1 つのオペランドとしてのみ使用でき、 このときの他方のオペランドは DATE、TIME、または TIMESTAMP です。 したがって、式 HIREDATE + 2 MONTHS + 14 DAYS は有効ですが、 式 HIREDATE + (2 MONTHS + 14 DAYS) は有効ではありません。 どちらの式でも 2 MONTHS と 14 DAYS がラベル付き期間です。
日付期間 は、DECIMAL(8,0) の数値として表現される年数、 月数、および日数を表します。 適切に解釈されるために、 この数値は yyyymmdd. という形式にする必要があります (yyyy は年数、 mm は月数、dd は日数を表します)。34 式 HIREDATE - BRTHDATE のように、 ある日付値から別の日付値を減算した結果が日付期間です。
時刻期間 は、DECIMAL(6,0) の数値として表現される時間数、 分数、および秒数を表します。 適切に解釈されるために、 この数値は hhmmss. という形式にする必要があります (hh は時間数、 mm は分数、ss は秒数を表します)。34 ある時刻値から別の時刻値を減算した結果が時刻期間です。
タイム・スタンプ期間 は、DECIMAL(20,6) の数値として表現され、 年数、月数、日数、時間数、分数、秒数、およびマイクロ秒数を表します。 適切に解釈されるために、 この数値は yyyymmddhhmmss.zzzzzz という形式にする必要があります (yyyy、 mm、dd、 hh、mm、 ss、および zzzzzz はそれぞれ、 年数、月数、日数、時間数、分数、秒数、およびマイクロ秒数を表します)。 あるタイム・スタンプ値から別のタイム・スタンプ値を減算した結果が、 タイム・スタンプ期間です。
日付 / 時刻値に関して実行できる算術演算は加算と減算だけです。 日付 / 時刻値が加算のオペランドである場合、 他方のオペランドは期間でなければなりません。 日付 / 時刻の値を使う加算演算子を使用するときには、 次のような特有の規則があります。
日付 / 時刻の値に減算演算子を使用する際の規則は、加算演算子の場合とは異なります。 これは、日付 / 時刻の値を期間から引くことができないため、 さらに 2 つの日付 / 時刻の値を差し引くことと期間を日付 / 時刻の値から差し引くこととは異なるためです。 日付 / 時刻の値を使う減算演算子を使用するときには、 次のような特有の規則があります。
日付は、減算、増分、および減分を行うことができます。
ある日付 (DATE2) を別の日付 (DATE1) から減算した結果は、 これら 2 つの日付の間の年数、月数、日数を示す日付期間です。 結果のデータ・タイプは DECIMAL(8,0) です。 DATE1 が DATE2 以上の場合、DATE1 から DATE2 が減算されます。 これに対し、DATE1 が DATE2 より小さい場合は、 DATE2 から DATE1 が減算され、結果の符号が負になります。 演算 RESULT = DATE1 - DATE2 の実行ステップを、以下に順に示します。
If DAY(DATE2) <= DAY(DATE1) then DAY(RESULT) = DAY(DATE1) - DAY(DATE2).
If DAY(DATE2) > DAY(DATE1) then DAY(RESULT) = N + DAY(DATE1) - DAY(DATE2) where N = the last day of MONTH(DATE2). MONTH(DATE2) is then incremented by 1.
If MONTH(DATE2) <= MONTH(DATE1) then MONTH(RESULT) = MONTH(DATE1) - MONTH(DATE2).
If MONTH(DATE2) > MONTH(DATE1) then MONTH(RESULT) = 12 + MONTH(DATE1) - MONTH(DATE2). YEAR(DATE2) is then incremented by 1.
YEAR(RESULT) = YEAR(DATE1) - YEAR(DATE2).
たとえば、DATE('3/15/2000') - '12/31/1999' の結果は 00000215 になります。 (すなわち、0 年 2 か月 15 日の期間です。)
日付に期間を加算したり、日付から期間を減算したりすると、 結果自体は日付となります。 (この演算では、月はカレンダーのページに相当します。 つまり、日付に月を加算することは、 その日付のページから順にカレンダーをめくっていくようなものです。) 結果は、0001 年 1 月 1 日以後 9999 年 12 月 31 日以前の日付となる必要があります。
年の期間を加算または減算する場合、 影響を受けるのは日付の年の部分だけです。 月も日も変更されませんが、 その結果がうるう年でない年の 2 月 29 日となった場合は別です。 その場合は日が 28 に変更され、 SQLCA の警告標識が日付調整の発生を示すように設定されます。
同様に、月の期間を加算または減算する場合、 影響を受けるのは月の部分だけです。ただし、 必要に応じて年の部分にも影響が及びます。 日付の日の部分は変更されませんが、 結果が無効な場合 (たとえば 9 月 31 日など) は別です。 その場合は日がその月の最後の日に設定され、 SQLCA の警告標識が日付調整の発生を示すように設定されます。
日の期間を加算または減算すると、日付の中の日の部分は当然影響を受けますが、 月および年も影響を受ける可能性があります。
日付期間も、正負にかかわらず、日付に対して加減算が行えます。 ラベル付き期間の場合と同じように、結果は有効な日付となり、 月末の調整が必要になれば SQLCA の警告標識が設定されます。
正の日付期間が日付に加算されるとき、 または負の日付期間が日付から減算されるときは、 日付は、指定した年数、月数、日数の順で増分されます。 したがって、X が正の DECIMAL(8,0) の数値であるとき、 DATE1 + X は以下の式と同等です。
DATE1 + YEAR(X) YEARS + MONTH(X) MONTHS + DAY(X) DAYS.
正の日付期間を日付から減算するとき、 または負の日付期間を日付に加算するとき、 日付は、指定した日数、月数、年数の順で減分されます。 したがって、X が正の DECIMAL(8,0) の数値であるとき、 DATE1 - X は以下の式と同等です。
DATE1 - DAY(X) DAYS - MONTH(X) MONTHS - YEAR(X) YEARS.
期間を日付に加算するとき、 特定の日付に 1 か月を加算すると、1 か月後の同じ日付になります。 ただし、1 か月後にその日付が存在しない場合は扱いが異なります。 その場合、日付は 1 か月後の最後の日に設定されます。 たとえば、1 月 28 日に 1 か月を加えると 2 月 28 日になります。 1 月 29、30、または 31 日に 1 か月を加えると通常の年では 2 月 28 日、 うるう年では 2 月 29 日になります。
注: | 特定の日付に 1 か月以上の月数を加算し、 その結果から同じ月数を減算した場合、 最終的な日付が元の日付と同じになるとは限りません。 |
時刻は、減算、増分、または減分を行うことができます。
ある時刻 (TIME2) を別の時刻 (TIME1) から減算した結果は、 それら 2 つの時刻の間の時間数、分数、秒数を示す時刻期間です。 結果のデータ・タイプは DECIMAL(6,0) です。
TIME1 が TIME2 と同じかまたはそれより大きい場合、 TIME1 から TIME2 が引かれます。
これに対し、TIME1 が TIME2 より小さい場合は、TIME2 から TIME1 が減算され、 結果の符号が負になります。 演算 RESULT = TIME1 - TIME2 の実行ステップを、以下に順に示します。
If SECOND(TIME2) <= SECOND(TIME1) then SECOND(RESULT) = SECOND(TIME1) - SECOND(TIME2).
If SECOND(TIME2) > SECOND(TIME1) then SECOND(RESULT) = 60 + SECOND(TIME1) - SECOND(TIME2). MINUTE(TIME2) is then incremented by 1.
If MINUTE(TIME2) <= MINUTE(TIME1) then MINUTE(RESULT) = MINUTE(TIME1) - MINUTE(TIME2).
If MINUTE(TIME1) > MINUTE(TIME1) then MINUTE(RESULT) = 60 + MINUTE(TIME1) - MINUTE(TIME2). HOUR(TIME2) is then incremented by 1.
HOUR(RESULT) = HOUR(TIME1) - HOUR(TIME2).
たとえば、TIME('11:02:26') - '00:32:56' の結果は 102930 になります。 (10 時間 29 分、30 秒の期間です。)
時刻に期間を加算したり、時刻から期間を減算したりすると、 結果自体は時刻となります。 時間数の桁あふれや下位桁あふれは捨てられ、 これにより常に結果が時刻となります。 時間数で指定する期間を加算または減算する場合、 影響を受けるのは時間数の部分だけです。 分数と秒数は変更されません。
同様に、分数で指定する期間を加算または減算する場合、 影響を受けるのは分の部分だけです。ただし、必要に応じて時間数の部分にも影響が及びます。 時刻の秒の部分は変更されません。
秒の期間を加算または減算すると、時刻の中の秒の部分は当然影響を受けますが、 分および時も影響を受ける可能性があります。
時刻期間も、正負にかかわらず、時刻との加減算を行えます。 結果は、指定した時間数、分数、 秒数の順に増分または減分された時刻となります。TIME1 + X ("X" は DECIMAL(6,0)) は次の式と同等です。
TIME1 + HOUR(X) HOURS + MINUTE(X) MINUTES + SECOND(X) SECONDS
注: | 時刻 '24:00:00' は有効な値として受け付けられますが、 時刻の加減算の結果として戻されることはありません。 これは、期間オペランドがゼロであっても同じです (たとえば、 time('24:00:00') 0 秒 ='00:00:00' となります)。 |
タイム・スタンプは、減算、増分、または減分を行うことができます。
あるタイム・スタンプ (TS2) を別のタイム・スタンプ (TS1) から減算した結果は、 それら 2 つのタイム・スタンプの間の年数、月数、日数、時間数、 分数、秒数、およびマイクロ秒数を示すタイム・スタンプ期間です。 結果のデータ・タイプは DECIMAL(20,6) です。
TS1 が TS2 以上の場合、TS1 から TS2 が減算されます。 これに対し、TS1 が TS2 より小さい場合は、TS2 から TS1 が減算され、 結果の符号が負になります。 演算 RESULT = TS1 - TS2 の実行ステップを、以下に順に示します。
If MICROSECOND(TS2) <= MICROSECOND(TS1) then MICROSECOND(RESULT) = MICROSECOND(TS1) - MICROSECOND(TS2).
If MICROSECOND(TS2) > MICROSECOND(TS1) then MICROSECOND(RESULT) = 1000000 + MICROSECOND(TS1) - MICROSECOND(TS2) and SECOND(TS2) is incremented by 1.
タイム・スタンプの秒および分の部分は、 時刻の減算規則で指定されたように減算されます。
If HOUR(TS2) <= HOUR(TS1) then HOUR(RESULT) = HOUR(TS1) - HOUR(TS2).
If HOUR(TS2) > HOUR(TS1) then HOUR(RESULT) = 24 + HOUR(TS1) - HOUR(TS2) and DAY(TS2) is incremented by 1.
タイム・スタンプの日付の部分は、日付の減算規則での説明と同じようにして減算されます。
タイム・スタンプに期間を加算したり、タイム・スタンプから期間を減算したりすると、 結果自体はタイム・スタンプとなります。 日付と時刻の算術演算はすでに説明したとおりに実行されますが、 時間数の桁あふれと下位桁あふれは結果の日付の部分に繰り上げまたは繰り下げられ、 有効な日付の範囲内に収められます。 マイクロ秒の桁あふれは秒に繰り上げられます。
括弧の中の式および参照解除操作が、最初に左から右へと評価されます。 35 評価の順序が括弧で指定されていない場合は、 まず接頭演算子が乗算および除算に先立って行われ、 次に乗算と除算が加算および減算に先立って行われます。 同じ優先順位の演算子は左から右に行われます。