タイム・スタンプの算術計算

タイム・スタンプは、減算、増分、または減分を行うことができます。

いずれかのオペランドが TIMESTAMP WITH TIME ZONE である場合、TIMESTAMP WITHOUT TIME ZONE 値は暗黙的に TIMESTAMP WITH TIME ZONE にキャストされ、日時算術演算は UTC 時間で実行されます (タイム・ゾーンは無視)。

タイム・スタンプの減算: あるタイム・スタンプ (TS2) を別のタイム・スタンプ (TS1) から引いた結果は、2 つのタイム・スタンプ間の年数、月数、日数、時間数、分数、秒数、および端数秒数を指定するタイム・スタンプ期間となります。

結果のデータ・タイプは DECIMAL(14+s,s) であり、sTS1TS2 の最大タイム・スタンプ精度です。 TS1TS2 より大きいか等しい場合は、TS1 から TS2 を引きます。 TS1TS2 より小さい場合。 ただし、TS1TS2 から引かれ、結果の符号は負になります。 タイム・ゾーンのオペランドを指定されたタイム・スタンプに関する減算は、そのタイムゾーンのタイム・スタンプの UTC 値に基づいて行われます。 タイム・ゾーンは無視されます。

RESULT = TS1 - TS2 の演算のために行われる手順を、次に解説します。
タイム・スタンプの減算: result = ts1 - ts2
  • MICROSECOND(TS2) <= MICROSECOND(TS1)の場合は、MICROSECOND(RESULT) = MICROSECOND(TS1) - MICROSECOND(TS2)
  • MICROSECOND(TS2) > MICROSECOND(TS1)の場合、MICROSECOND(RESULT) = 1000000 + MICROSECOND(TS1)- MICROSECOND(TS2)およびSECOND(TS2)は 1 ずつ増分されます。
  • SECOND(TS2,s) <= SECOND(TS1,s)の場合は、SECOND(RESULT,s) = SECOND(TS1,s) - SECOND(TS2,s)
  • SECOND(TS2,s) > SECOND(TS1,s)の場合は、SECOND(RESULT,s) = 60 + SECOND(TS1,s) – SECOND(TS2,s)

    MINUTE(TS2) に 1 が加えられます。

  • HOUR(TS2) <= HOUR(TS1)の場合は、HOUR(RESULT) = HOUR(TS1) - HOUR(TS2)
  • HOUR(TS2) > HOUR(TS1)の場合、HOUR(RESULT) = 24 + HOUR(TS1) - HOUR(TS2)およびDAY(TS2)は 1 ずつ増分されます。

タイム・スタンプの分の部分は、時刻の減算規則で指定されたように減算されます。

タイム・スタンプの日付の部分は、日付の減算規則での説明と同じようにして減算されます。

タイム・スタンプの増分および減分: タイム・スタンプに 期間を加算した結果またはタイム・スタンプから期間を減算した結果は、 それ自体がタイム・スタンプです。 結果タイム・スタンプの精度は、タイム・スタンプ・オペランドの精度に一致します。 日付/時刻の算術計算は、これまでの定義どおりに実行されます。ただし、オーバーフローまたはアンダーフローとなった分の時間が結果の日付の部分に繰り上げられることだけが異なります。この結果は、有効な日付の範囲内でなければなりません。 時刻の算術計算部分は、期間に秒数の小数点部分も考慮されるという点を除いては時刻の算術計算と同様です。 例えば、タイム・スタンプ TIMESTAMP1 から期間 X (X は DECIMAL(14+s,s) の数値) を減算することは、以下の式と同等です。
TIMESTAMP1 - YEAR(X)  YEARS - MONTH(X)  MONTHS - DAY(X)  DAYS
           - HOUR(X)  HOURS - MINUTE(X)  MINUTES - SECOND(X, s)  SECONDS
ゼロ以外の位取りの期間、または値に秒の小数点部分が含まれる SECOND または SECONDS のラベル付き期間を減算する場合、その減算は最大で小数点以下 12 桁の秒が含まれるタイム・スタンプ値であるかのように実行されます。 結果値は、タイム・スタンプ・オペランドのタイム・スタンプの精度を持つタイム・スタンプ値に割り当てられ、その結果として秒の小数部分の桁は切り捨てられます。

演算結果が真夜中になった場合、結果の時刻の部分は「24.00.00」または「00.00.00」になります。 これらの 2 つの値の比較は「等しい」ことになりません。 マイクロ秒はオーバーフローすると秒になります。