日付(DATE)、タイムスタンプ(TIMESTAMP、TIMESTAMP WITH TIME ZONE、TIMESTAMP WITH LOCAL TIME ZONE)、および間隔(INTERVAL YEAR TO MONTH、INTERVAL DAY TO SECOND)データ型は算術演算をサポートしています。本記事では主に日付時刻DATEと間隔INTERVALの計算ルールについて説明します。
OceanBaseデータベースは、次のルールに基づいて結果を計算します:
日付とタイムスタンプ値(間隔値ではない)の算術演算では、
NUMBER定数を使用できます。OceanBaseデータベースは内部でタイムスタンプ値を日付値に変換し、算術的な日付時刻および間隔式におけるNUMBER定数を日数として解釈します。例えば、SYSDATE+1は明日です。SYSDATE-7は1週間前です。SYSDATE+(10/1440)は10分後です。注意
日付またはタイムスタンプ値に対して乗算または除算を行うことはできません。
OceanBaseデータベースは
BINARY_FLOATとBINARY_DOUBLEオペランドをNUMBERに変換します。各
DATE値には時間要素が含まれており、多くの日付演算の結果には分数が含まれます。この分数は1日の一部を表します。例えば、1.5日は36時間です。OceanBaseの組み込み関数はこれらの分数も返し、DATEデータに対する一般的な操作を実行します。例えば、MONTHS_BETWEEN関数は2つの日付の間の月数を返します。結果の小数部分は31日の月のその部分を表します。オペランドが
DATE値または数値であり、タイムゾーンや小数秒部分を含まない場合:- OceanBaseデータベースは他のオペランドをDATEデータに変換します。ただし、数値に間隔を掛ける演算は例外であり、間隔が返されます。
- 他のオペランドにタイムゾーン値がある場合、OceanBaseデータベースは返される値で現在のセッションのタイムゾーンを使用します。
- 他のオペランドに小数秒値がある場合、小数秒値は失われます。
タイムスタンプ、時間間隔、または数値を
DATEデータ型専用の組み込み関数に渡す場合、OceanBaseデータベースは非DATE値をDATE値に変換します。間隔計算が日付時刻値を返す場合、結果は実際の日付時刻値でなければなりません。そうでない場合、データベースはエラーを返します。例:
SELECT TO_DATE("31-AUG-2004','DD-MON-YYYY") + TO_YMINTERVAL("0-1") FROM DUAL; SELECT TO_DATE("29-FEB-2004','DD-MON-YYYY") + TO_YMINTERVAL("1-0") FROM DUAL;最初の文は31日の月に1か月を加えるため、計算結果は9月31日となり、これは有効な日付ではないため実行に失敗します。2番目の文は4年ごとにしか存在しない日付に1年を加えることは無効であり、実行に失敗します。しかし、2月29日の4年前に加えることは有効であり、計算結果は
2008年2月29日となります:SELECT TO_DATE("29-FEB-2004", "DD-MON-YYYY") + TO_YMINTERVAL("4-0") FROM DUAL;以下の表は日付時刻の算術演算のマトリックスです。「---」はサポートされていない操作を示します。
