DATEADD

按照指定的时间单位datepart,在指定的日期date或时间戳上增加指定的幅度delta

注意事项

如果您需要获取在当前时间基础上指定变动幅度的日期,请结合GETDATE函数使用。

命令格式

DATEADD(DATE|DATETIME|TIMESTAMP|TIMESTAMP_NTZ <date>, BIGINT <delta>, STRING <datepart>)

参数说明

  • date:必填。日期或时间戳,支持DATE、DATETIME、TIMESTAMPTIMESTAMP_NTZ类型。

    MaxCompute1.0数据类型版本下,如果参数为STRING类型,格式符合DATETIME类型的格式,即yyyy-mm-dd hh:mi:ss,例如2025-07-21 00:00:00,则会隐式转换为DATETIME类型后参与运算。

  • delta:必填。修改幅度,BIGINT类型。如果delta大于0,则增,否则减。

    MaxCompute1.0数据类型版本下,如果参数为STRINGDOUBLE类型的数字,则会隐式转换为BIGINT类型后参与运算。

    说明
    • 按照指定的单位增减delta时,会导致更高单位的进位或退位。年、月、时、分秒分别按照10进制、12进制、24进制、60进制进行计算。

    • delta的单位是月时,如果delta的月部分在增加delta值之后不造成Day溢出,则保持Day值不变,否则将Day值设置为结果月份的最后1天。

  • datepart:必填。指定修改的时间单位,STRING类型常量。非常量、不支持的格式或其他类型会返回报错。 支持如下取值:

    时间单位

    取值

    yearyyyy

    季度

    quarterq

    monthmonmm

    week

    daydd

    小时

    hourhh

    分钟

    mi

    ss

    毫秒

    ff3

    微秒

    ff6

返回值说明

返回DATE、DATETIME、TIMESTAMPTIMESTAMP_NTZ类型,与输入date参数数据类型一致。返回规则如下:

  • date数据类型非DATE、DATETIME、TIMESTAMPTIMESTAMP_NTZ类型时,则返回报错。

  • date值为NULL时,返回报错。

  • deltadatepart值为NULL时,返回NULL。

使用示例

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

    -- 返回2005-03-01 00:00:00。加1天,结果超出当年2月份的最后一天,实际值为下个月的第1天。
    SELECT DATEADD(DATETIME '2005-02-28 00:00:00', 1, 'dd');
    -- 返回2005-02-27 00:00:00。减1天。
    SELECT DATEADD(DATETIME '2005-02-28 00:00:00', -1, 'dd');
    -- 返回2006-10-28 00:00:00。加20个月,月份溢出,年份加1。
    SELECT DATEADD(DATETIME '2005-02-28 00:00:00', 20, 'mm');
    -- 返回2005-03-28 00:00:00。
    SELECT DATEADD(DATETIME '2005-02-28 00:00:00', 1, 'mm');
    -- 返回2005-02-28 00:00:00。20052月没有29日,日期截取至当月最后1天。
    SELECT DATEADD(DATETIME '2005-01-29 00:00:00', 1, 'mm');
    -- 返回2005-02-28 00:00:00。
    SELECT DATEADD(DATETIME '2005-03-30 00:00:00', -1, 'mm');
    -- 返回2005-05-28。
    SELECT DATEADD(DATE '2005-02-28', 1, 'quarter');
    -- 返回2005-03-18。
    SELECT DATEADD(DATE '2005-02-18', 1, 'mm');
    -- 返回: 2005-03-14 00:00:00。
    SELECT DATEADD(DATETIME '2005-02-28 00:00:00', 2, 'week');
    -- 返回: 2005-03-14 00:00:00.123
    SELECT DATEADD(TIMESTAMP '2005-02-28 00:00:00.123', 14, 'day');
    -- 返回2005-03-30 02:24:00。减去3小时 
    SELECT DATEADD(DATETIME '2005-03-30 05:24:00', -3, 'hh');
    -- 返回2005-03-30 04:54:00。减去30分钟 
    SELECT DATEADD(DATETIME '2005-03-30 05:24:00', -30, 'mi');
    -- 返回2005-03-30 05:23:30。减去30秒 
    SELECT DATEADD(DATETIME '2005-03-30 05:24:00', -30, 'ss');
    -- 返回: 2005-02-28 00:00:01.123456
    SELECT DATEADD(TIMESTAMP_NTZ '2005-02-28 00:00:00.123456', 1000, 'ff3');
    -- 返回: 2005-02-28 00:00:00.124456
    SELECT DATEADD(TIMESTAMP '2005-02-28 00:00:00.123456', 1000, 'ff6');
    
    -- 开启2.0新类型。此命令需要与SQL语句一起提交。返回2005-03-18 00:00:00.0。
    set odps.sql.type.system.odps2=true;
    SELECT DATEADD(TIMESTAMP '2005-02-18 00:00:00', 1, 'mm');
    -- 假设当前时间为2020-11-17 16:31:44,返回2020-11-16 16:31:44。
    SELECT DATEADD(GETDATE(), -1, 'dd');
    -- 返回NULL。
    SELECT DATEADD(DATE '2005-02-18', 1, NULL);
  • 示例2:date参数类型说明

    • 对于MaxCompute2.0数据类型版本,若dateDATE、DATETIME、TIMESTAMPTIMESTAMP_NTZ类型,需要进行类型转换,否则会报错。

      SELECT DATEADD(CAST('2005-03-30 00:00:00' AS datetime), -1, 'mm');
      
      -- 返回结果。
      +------------+
      | _c0        | 
      +------------+
      | 2005-02-28 00:00:00 | 
      +------------+
    • 对于MaxCompute1.0数据类型版本,若dateSTRING类型,且格式符合DATETIME类型的格式即yyyy-mm-dd hh:mi:ss,则会隐式转换为DATETIME类型后参与运算。

      -- 设置数据类型版本为1.0
      SET odps.sql.type.system.odps2=false;
      SET odps.sql.hive.compatible=false;
      
      -- 错误示例:如下输入参数为STRING类型,但不符合DATETIME类型格式,会返回NULL。
      SELECT DATEADD('2021-08-27',1,'dd');
      
      -- 正确示例:如下输入参数为STRING类型,符合DATETIME类型格式。
      SELECT DATEADD('2005-02-28 00:00:00', 1000000000, 'ff6');
      
      -- 返回结果。
      +------------+
      | _c0        | 
      +------------+
      | 2005-02-28 00:16:40 | 
      +------------+

相关函数

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