DATEDIFF

DATEDIFF函数用于计算date1date2的差值,将差值以指定的时间单位datepart表示。

命令格式

BIGINT|INT DATEDIFF(STRING|DATE|DATETIME|TIMESTAMP|TIMESTAMP_NTZ <date1>, STRING|DATE|DATETIME|TIMESTAMP|TIMESTAMP_NTZ <date2>[, STRING <datepart>])

参数说明

  • date1date2:必填。日期或时间戳,支持STRING、DATE、DATETIME、TIMESTAMPTIMESTAMP_NTZ类型。分别是被减数和减数。

    如果输入为STRING类型,其日期格式需包含yyyy-mm-dd,且不支持指定datepart参数。

    说明

    MaxCompute1.0数据类型版本下,若date1date2STRING类型,时间格式符合DATETIME类型的格式,即yyyy-mm-dd hh:mi:ss,例如2021-08-28 00:00:00,则会隐式转换为DATETIME类型后参与运算。

  • datepart:可选。指定返回值的时间单位,若未指定,则默认为天。STRING类型常量。支持以下取值:

    时间单位

    取值

    yearyyyy

    monthmonmm

    weekweek(weekday)

    ISO

    isoweek

    daydd

    小时

    hourhh

    分钟

    mi

    ss

    毫秒

    ff3

    微秒

    ff6

    说明
    • 系统计算时会先按照datepart切掉低单位部分,然后再计算结果。若设置SET odps.sql.bigquery.compatible=true;系统计算时会先计算差值,再以指定的时间单位datepart表示。

    • week是以周一为一周的第一天,等效于week(weekday)

    • week(weekday)周从指定的星期几(weekday)开始算起。weekday的有效值为:周日(SUNDAY)、周一(MONDAY)、周二(TUESDAY)、周三(WEDNESDAY)、周四(THURSDAY)、周五(FRIDAY)以及周六(SATURDAY)。

    • isoweek采用ISO 8601所规定的周边界。ISO标准下的周从周一开始算起

返回值说明

返回BIGINTINT类型。返回规则如下:

  • 若使用datepart,则返回BIGINT类型;若未使用datepart,则返回INT类型。

  • date1date2STRING、DATE、DATETIME、TIMESTAMPTIMESTAMP_NTZ类型时,返回报错。

  • 如果date1小于date2,返回值为负数。

  • date1date2datepart值为NULL时,返回NULL。

使用示例

示例1:静态数据常见用法

-- 返回 -86400000000 
SELECT DATEDIFF(DATE "2025-03-01", DATE '2025-03-02', 'ff6');
-- 返回 -640815000
SELECT DATEDIFF(TIMESTAMP "2025-03-07 15:30:00.123", TIMESTAMP "2025-03-15 01:30:15.123456", 'ff3');
-- 返回 13
SELECT DATEDIFF(DATETIME "2025-07-01 00:00:00", DATETIME '2025-03-28 01:30:09', 'week(friday)');
-- 返回 20
SELECT DATEDIFF(TIMESTAMP_NTZ "2025-06-07 10:30:00.123", TIMESTAMP_NTZ "2025-01-15 00:30:45.123456", 'isoweek');

示例2:时间差计算模式切换

系统计算时会按照datepart切掉低单位部分,然后再计算结果。若设置SET odps.sql.bigquery.compatible=true;系统计算时会先计算差值,再以指定的时间单位datepart表示。

-- 返回 5
SELECT DATEDIFF(CAST('2024-11-01 10:05:05' AS TIMESTAMP), CAST('2024-11-01 10:00:10' AS TIMESTAMP), 'mi'  ) AS diff_in_minute1;
-- 返回 4
SET odps.sql.bigquery.compatible=true;
SELECT DATEDIFF(CAST('2024-11-01 10:05:05' AS TIMESTAMP), CAST('2024-11-01 10:00:10' AS TIMESTAMP), 'mi'  ) AS diff_in_minute1;

示例3:date1、date2参数为STRING类型

  • MaxCompute1.0数据类型版本下,若date1date2STRING类型且时间格式符合DATETIME类型的格式,即yyyy-mm-dd hh:mi:ss,则会隐式转换为DATETIME类型后参与运算。

    -- 设置数据类型版本为1.0
    SET odps.sql.type.system.odps2=false;
    SET odps.sql.hive.compatible=false;
    
    -- 错误示例:如下输入参数为STRING类型,日期格式为yyyy-mm-dd,但指定datepart参数,返回NULL。
    SELECT DATEDIFF('2025-07-27','2025-07-20','dd');
    -- 返回结果。
    +------------+
    | _c0        | 
    +------------+
    | NULL       | 
    +------------+
    -- 正确示例:如下输入参数为STRING类型,符合DATETIME类型格式。支持指定datepart参数
    SELECT DATEDIFF("2025-07-01 00:21:00", "2025-03-28 01:30:09", 'hour');
    -- 返回结果。
    +------------+
    | _c0        |
    +------------+
    | 2279       |
    +------------+
  • date1date2STRING类型,其日期格式需包含yyyy-mm-dd,且不支持指定datepart参数。

    • MaxCompute1.0数据类型版本示例如下:

      -- 设置数据类型版本为1.0
      SET odps.sql.type.system.odps2=false;
      SET odps.sql.hive.compatible=false;
      
      -- 错误示例:如下输入参数为STRING类型,日期格式为yyyy-mm-dd,且指定datepart参数,则返回NULL。
      SELECT DATEDIFF("2025-07-01", "2025-06-28",'day');
      
      -- 正确示例:如下输入参数为STRING类型,日期格式为yyyy-mm-dd,且未指定datepart参数,默认datepart为天。
      SELECT DATEDIFF("2025-07-01", "2025-06-28");
      -- 返回结果。
      +------+
      | _c0  |
      +------+
      | 3    |
      +------+
    • MaxCompute2.0数据类型版本示例如下:

      -- 设置数据类型版本为2.0
      SET odps.sql.type.system.odps2=true;
      SET odps.sql.hive.compatible=false;
      
      -- 错误示例:如下输入参数为STRING类型,日期格式包含yyyy-mm-dd,且指定datepart参数,则返回报错。
      SELECT DATEDIFF("2025-07-01", "2025-06-28 01:30:09.123",'hour');
      
      -- 正确示例:如下输入参数为STRING类型,日期格式包含yyyy-mm-dd,且未指定datepart参数,默认datepart为天。
      SELECT DATEDIFF("2025-07-01", "2025-06-28 01:30:09.123");
      -- 返回结果。
      +------+
      | _c0  |
      +------+
      | 3    |
      +------+
      
      

相关函数

DATEDIFF函数属于日期函数,更多日期计算、日期转换的相关函数请参见日期函数