MaxCompute提供了DATE、DATETIME、TIMESTAMP及TIMESTAMP_NTZ四種日期時間相關資料類型。另外也提供代表時間段的INTERVAL資料類型,用來表示兩個日期或時間之間的時間間隔。本文為您介紹INTERVAL類型的使用方法。
使用限制
使用INTERVAL資料類型時,您需要先設定SET odps.sql.type.system.odps2=true;
,以開啟MaxCompute 2.0資料類型。
使用說明
INTERVAL資料類型支援如下兩種類型:
INTERVAL_YEAR_MONTH:表示年月間隔,使用
YEAR
和MONTH
欄位儲存時間間隔。INTERVAL_DAY_TIME:表示日間間隔,使用包括小數秒在內的天、小時、分鐘和秒儲存間隔。
INTERVAL_YEAR_MONTH
文法
文法格式
描述
樣本
INTERVAL '<year | -year>-<month>' YEAR TO MONTH
同時指定YEAR和MONTH間隔。
間隔120年3個月:
INTERVAL '120-3' YEAR TO MONTH
INTERVAL '-120-3' YEAR TO MONTH
INTERVAL '<year | -year>' YEAR
僅指定YEAR間隔。
間隔9年:
INTERVAL '9' YEAR
INTERVAL '-9' YEAR
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)
參數說明
year:取值範圍為[0, 9999]。
month:取值範圍為[0, 11]。
注意事項
僅指定MONTH間隔時,month取值可以超過11,超過部分會折算為YEAR進行計算。樣本如下:
SELECT INTERVAL '200' MONTH;
返回結果:
+------------+ | _c0 | +------------+ | 16-8 | +------------+
同時指定YEAR和MONTH時,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天:
INTERVAL '1' DAY
INTERVAL '-1' DAY
INTERVAL '<hour | -hour>' HOUR
僅指定HOUR間隔。
間隔1小時:
INTERVAL '1' HOUR
INTERVAL '-1' HOUR
INTERVAL '<minute | -minute>' MINUTE
僅指定MINUTE間隔。
間隔1分鐘:
INTERVAL '1' MINUTE
INTERVAL '-1' MINUTE
INTERVAL '<second | -second>' SECOND
僅指定SECOND間隔。
間隔1.1秒:
INTERVAL '1.1' MINUTE
INTERVAL '-1.1' MINUTE
INTERVAL '<day | -day> <hour>' DAY TO HOUR
同時指定DAY和HOUR間隔
間隔1天23小時:
INTERVAL '1 23' DAY TO HOUR
INTERVAL '-1 23' DAY TO HOUR
INTERVAL '<day | -day> <hour>:<minute>' DAY TO MINUTE
同時指定DAY、HOUR和MINUTE間隔。
間隔1天23小時59分鐘:
INTERVAL '1 23:59' DAY TO MINUTE
INTERVAL '-1 23:59' DAY TO MINUTE
INTERVAL '<day | -day> <second>' DAY TO SECOND
同時指定DAY、HOUR、MINUTE和SECOND間隔。
間隔1天23小時59分59.999秒:
INTERVAL '1 23:59:59.999' DAY TO SECOND
INTERVAL '-1 23:59:59.999' DAY TO SECOND
INTERVAL '<hour | -hour>:<minute>' HOUR TO MINUTE
同時指定HOUR和MINUTE間隔。
間隔23小時59分鐘:
INTERVAL '23:59' HOUR TO MINUTE
INTERVAL '-23:59' HOUR TO MINUTE
INTERVAL '<hour | -hour>:<minute>:<second>' HOUR TO MINUTE
同時指定HOUR、MINUTE和SECOND間隔。
間隔23小時59分59.999秒:
INTERVAL '23:59:59.999' HOUR TO SECOND
INTERVAL '-23:59:59.999' HOUR TO SECOND
INTERVAL '<minute | -minute>:<second>' MINUTE TO SECOND
同時指定MINUTE和SECOND間隔。
間隔59分59.999秒:
INTERVAL '59:59.999' MINUTE TO SECOND
INTERVAL '-59:59.999' MINUTE TO SECOND
參數說明
day:取值範圍為[0, 2147483647]。
hour:取值範圍為[0, 23]。
minute:取值範圍為[0, 59]。
second:取值範圍為[0, 59.999999999]。
注意事項
僅指定HOUR/MINUTE/SECOND間隔時,對應參數取值可以超過範圍上限,超過的部分會被折算為更大的單位。樣本如下:
SELECT INTERVAL '24' HOUR; -- 等價於 INTERVAL '1' DAY SELECT INTERVAL '60' MINUTE; -- 等價於 INTERVAL '1' HOUR SELECT INTERVAL '6000' SECOND; -- 等價於 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
運算
情境一:同類型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 '+'
情境二:DATE類型、TIMESTAMP類型或TIMESTAMP_NTZ類型相減,結果為INTERVAL_DAY_TIME類型
不支援DATETIME類型之間進行減運算。
樣本1:兩個DATE類型相減。
SELECT DATE '2021-10-29' - DATE '2024-11-29';
返回結果:
+------------+ | _c0 | +------------+ | -1127 00:00:00.000000000 | +------------+
樣本2:兩個TIMESTAMP類型相減。
SELECT TIMESTAMP '2024-11-29 00:01:10' - TIMESTAMP'2021-10-29 00:01:00';
返回結果:
+------------+ | _c0 | +------------+ | 1127 00:00:10.000000000 | +------------+
樣本3(錯誤樣本):不支援兩個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 '-'
情境三:DATE、TIMESTAMP、TIMESTAMP_NTZ類型與INTERVAL類型相加減的結果為DATE類型、TIMESTAMP類型、TIMESTAMP_NTZ類型
不支援DATETIME類型與INTERVAL類型之間進行加減運算。
樣本1:DATE類型與INTERVAL_YEAR_MONTH類型相減。
SELECT DATE '2021-11-11' - INTERVAL '-1' MONTH;
返回結果:
+------------+ | _c0 | +------------+ | 2021-12-11 | +------------+
樣本2:TIMESTAMP_NTZ類型與INTERVAL_DAY_TIME類型相減。
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 '-'