全部產品
Search
文件中心

:INTERVAL資料類型

更新時間:Dec 10, 2024

MaxCompute提供了DATE、DATETIME、TIMESTAMP及TIMESTAMP_NTZ四種日期時間相關資料類型。另外也提供代表時間段的INTERVAL資料類型,用來表示兩個日期或時間之間的時間間隔。本文為您介紹INTERVAL類型的使用方法。

使用限制

使用INTERVAL資料類型時,您需要先設定SET odps.sql.type.system.odps2=true;,以開啟MaxCompute 2.0資料類型。

使用說明

INTERVAL資料類型支援如下兩種類型:

  • INTERVAL_YEAR_MONTH:表示年月間隔,使用YEARMONTH欄位儲存時間間隔。

  • 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 '-'