MaxComputeは、date、DATETIME、TIMESTAMP、TIMESTAMP_NTZの4つの日付と時刻に関連するデータ型をサポートしています。 また、2つの日付または時刻の間の期間を示すINTERVALデータ型も提供します。 このトピックでは、INTERVAL型の使用方法について説明します。
前提条件
INTERVALデータ型を使用するには、SET odps.sql.type.system.odps2=true;
を設定して、MaxCompute 2.0データ型を有効にする必要があります。
使用方法の指示
INTERVALデータ型は2つのタイプをサポートします。
INTERVAL_YEAR_MONTH:
year
およびmonth
フィールドを使用して、年と月の間隔を格納します。INTERVAL_DAY_TIME: 日、時間、分、秒、および分数秒単位の日間間隔を格納します。
INTERVAL_YEAR_月
構文
構文形式
説明
例
INTERVAL '<year | -year>-<month>' YEAR TO MONTH
YEARとMONTHの両方の間隔を指定します。
120年と3ヶ月の间隔:
インターバル「120-3」月まで
インターバル '-120-3' 月まで
INTERVAL '<year | -year>' YEAR
YEAR間隔のみを指定します。
9年の间隔:
インターバル '9' 年
インターバル '-9' 年
INTERVAL '<month | -month>' MONTH
MONTH間隔のみを指定します。
40ヶ月 (3年と4ヶ月) の间隔:
INTERVAL '40' MONTH (INTERVAL '3-4' YEAR to MONTHに相当)
INTERVAL '-40' MONTH (INTERVAL '-3-4' YEAR to MONTHに相当)
有効なパラメーター範囲
年: [0, 9999] 。
月: [0, 11] 。
注意事項
月間隔のみを指定する場合、月の値は11を超えることがあり、11を超える値は計算のために年に変換されます。 次のコードは例を示しています。
SELECT INTERVAL '200' MONTH;
以下の結果が返されます。
+------------+ | _c0 | +------------+ | 16-8 | +------------+
YEARとMONTHの両方を指定する場合、月の値は11を超えることはできません。 次のコードは正しくない例です。
SELECT INTERVAL '-2021-12' YEAR TO MONTH;
以下の結果が返されます。
FAILED: ODPS-0130161:[1,17] Parse exception - cannot parse -2021-12 as a valid INTERVAL_DAY_TIME
INTERVAL_DAY_TIME
構文
構文形式
説明
例
INTERVAL '<day | -day>' DAY
DAY間隔のみを指定します。
1日の間隔:
インターバル「1日」
インターバル '-1' 日
INTERVAL '<hour | -hour>' HOUR
HOUR間隔のみを指定します。
1時間の間隔:
インターバル「1」時間
インターバル '-1' アワー
INTERVAL '<minute | -minute>' MINUTE
MINUTE間隔のみを指定します。
1分の间隔:
インターバル「1」分
INTERVAL '-1' 分
INTERVAL '<second | -second>' SECOND
SECOND間隔のみを指定します。
1.1秒の间隔:
インターバル '1.1 '第2
インターバル '-1.1' 2番目
INTERVAL '<day | -day> <hour>' DAY TO HOUR
DAYとHOURの両方の間隔を指定します。
1日と23時間の間隔:
INTERVAL '1 23' DAY TO HOUR
インターバル '-1 23' 日から時間
INTERVAL '<day | -day> <hour>:<minute>' DAY TO MINUTE
DAY、HOUR、MINUTEの間隔を同時に指定します。
1日、23時間、59分の間隔:
インターバル「1 23:59」分まで
INTERVAL '-1 23:59' DAY TO MINUTE
INTERVAL '<day | -day> <second>' DAY TO SECOND
DAY、HOUR、MINUTE、および2番目の間隔を同時に指定します。
1日、23時間、59分、59.999秒の間隔:
インターバル '1 23:59:59.999 '2日目
INTERVAL '-1 23:59:59.999' 2日目
INTERVAL '<hour | -hour>:<minute>' HOUR TO MINUTE
HOURとMINUTEの両方の間隔を指定します。
23時間59分の間隔:
インターバル '23:59' 分までの時間
インターバル '-23:59' 分
INTERVAL '<hour | -hour>:<minute>:<second>' HOUR TO SECOND
HOUR、MINUTE、およびSECOND間隔を同時に指定します。
23時間、59分、59.999秒の間隔:
インターバル '23:59:59.999 '2番目の時間
INTERVAL '-23:59:59.999' 2時間
INTERVAL '<minute | -minute>:<second>' MINUTE TO SECOND
MINUTEとSECONDの両方の間隔を指定します。
59分59.999秒の间隔:
インターバル '59:59.999 '分から2番目
インターバル '-59:59.999' 分から2番目
有効なパラメーター範囲
day: [0, 2147483647] 。
hour: [0, 23] 。
minute: [0, 59] 。
second: [0, 59.999999999] 。
注意事項
HOUR、MINUTE、またはSECOND区間のみを指定した場合、値は上限を超える可能性があり、超過分はより大きな単位に変換されます。 次のコードは例を示しています。
SELECT INTERVAL '24' HOUR; -- Equivalent to INTERVAL '1' DAY SELECT INTERVAL '60' MINUTE; -- Equivalent to INTERVAL '1' HOUR SELECT INTERVAL '6000' SECOND; -- Equivalent to INTERVAL '1:40' HOUR TO MINUTE
その他の用途では、各パラメーターの値が上限を超えてはなりません。 次のコードが正しくありません。
SELECT INTERVAL '23:60' HOUR TO MINUTE;
以下の結果が返されます。
FAILED: ODPS-0130161:[1,17] Parse exception - cannot parse 23:60 as a valid INTERVAL_DAY_TIME
操作
シナリオ1: 同じタイプのINTERVAL間の加算と減算
加算と減算は同じタイプのINTERVALでサポートされますが、異なるINTERVAL_DAY_TIMEタイプとINTERVAL_YEAR_MONTHタイプの間ではサポートされません。
例1: INTERVAL_DAY_TIMEタイプ間の追加。
SELECT INTERVAL '24' HOUR + INTERVAL '23' HOUR;
以下の結果が返されます。
+------------+ | _c0 | +------------+ | 1 23:00:00.000000000 | +------------+
例2: INTERVAL_DAY_TIMEタイプ間の減算。
SELECT INTERVAL '24' HOUR + INTERVAL '-23' HOUR;
以下の結果が返されます。
+------------+ | _c0 | +------------+ | 0 01:00:00.000000000 | +------------+
例3: INTERVAL_YEAR_MONTHタイプ間の減算。
SELECT INTERVAL '5-1' YEAR TO MONTH - INTERVAL '9-2' YEAR TO MONTH;
以下の結果が返されます。
+------------+ | _c0 | +------------+ | -4-1 | +------------+
例4 (不正): INTERVAL_DAY_TIMEとINTERVAL_YEAR_MONTHの間の操作はサポートされていません。 次のコードが正しくありません。
SELECT INTERVAL '2000-1' YEAR TO MONTH + INTERVAL '1 23:59:59.999' DAY TO SECOND;
以下の結果が返されます。
FAILED: ODPS-0130071:[1,8] Semantic analysis exception - invalid operand type(s) INTERVAL_YEAR_MONTH,INTERVAL_DAY_TIME for operator '+'
シナリオ2: DATE、TIMESTAMP、またはTIMESTAMP_NTZ型の減算の結果、INTERVAL_DAY_TIME型
異なるDATETIMEタイプ間の減算はサポートされていません。
例1: 2つのDATEタイプ間の減算。
SELECT DATE '2021-10-29' - DATE '2024-11-29';
以下の結果が返されます。
+------------+ | _c0 | +------------+ | -1127 00:00:00.000000000 | +------------+
例2: 2つのTIMESTAMPタイプ間の減算。
SELECT TIMESTAMP '2024-11-29 00:01:10' - TIMESTAMP'2021-10-29 00:01:00';
以下の結果が返されます。
+------------+ | _c0 | +------------+ | 1127 00:00:10.000000000 | +------------+
例3 (不正): 2つのDATETIMEタイプ間の減算はサポートされていません。 次のコードが正しくありません。
SELECT DATETIME '2024-11-11 00:00:00' - DATETIME'2021-11-11 00:00:00';
以下の結果が返されます。
FAILED: ODPS-0130071:[1,8] Semantic analysis exception - invalid operand type(s) DATETIME,DATETIME for operator '-'
シナリオ3: DATE、TIMESTAMP、TIMESTAMP_NTZ型とINTERVAL型の加算と減算の結果、DATE、TIMESTAMP、TIMESTAMP_NTZ型
DATETIME型とINTERVAL型の間の加算と減算はサポートされていません。
例1: INTERVAL_YEAR_MONTHタイプを持つDATEタイプの減算。
SELECT DATE '2021-11-11' - INTERVAL '-1' MONTH;
以下の結果が返されます。
+------------+ | _c0 | +------------+ | 2021-12-11 | +------------+
例2: INTERVAL_DAY_TIMEタイプからのTIMESTAMP_NTZタイプの減算。
SELECT TIMESTAMP_NTZ'2024-11-29 00:01:10' - INTERVAL '1 23' DAY TO HOUR;
以下の結果が返されます。
+------------+ | _c0 | +------------+ | 2024-11-27 01:01:10 | +------------+
例3 (不正): DATETIME型とINTERVAL型の間の加算と減算はサポートされていません。 次のコードが正しくありません。
SELECT DATETIME '2024-11-11 00:00:00' - INTERVAL '1 23' DAY TO HOUR;
以下の結果が返されます。
FAILED: ODPS-0130071:[1,8] Semantic analysis exception - invalid operand type(s) DATETIME,INTERVAL_DAY_TIME for operator '-'