按照指定的时间单位datepart,在指定的日期date或时间戳上增加指定的幅度delta。
注意事项
如果您需要获取在当前时间基础上指定变动幅度的日期,请结合GETDATE函数使用。
命令格式
DATEADD(DATE|DATETIME|TIMESTAMP|TIMESTAMP_NTZ <date>, BIGINT <delta>, STRING <datepart>)
参数说明
date:必填。日期或时间戳,支持DATE、DATETIME、TIMESTAMP或TIMESTAMP_NTZ类型。
在MaxCompute1.0数据类型版本下,如果参数为STRING类型,格式符合DATETIME类型的格式,即
yyyy-mm-dd hh:mi:ss
,例如2025-07-21 00:00:00
,则会隐式转换为DATETIME类型后参与运算。delta:必填。修改幅度,BIGINT类型。如果delta大于0,则增,否则减。
在MaxCompute1.0数据类型版本下,如果参数为STRING或DOUBLE类型的数字,则会隐式转换为BIGINT类型后参与运算。
说明按照指定的单位增减delta时,会导致更高单位的进位或退位。年、月、时、分秒分别按照10进制、12进制、24进制、60进制进行计算。
当delta的单位是月时,如果delta的月部分在增加delta值之后不造成Day溢出,则保持Day值不变,否则将Day值设置为结果月份的最后1天。
datepart:必填。指定修改的时间单位,STRING类型常量。非常量、不支持的格式或其他类型会返回报错。 支持如下取值:
时间单位
取值
年
year
或yyyy
季度
quarter
或q
月
month
或mon
或mm
周
week
日
day
或dd
小时
hour
或hh
分钟
mi
秒
ss
毫秒
ff3
微秒
ff6
返回值说明
返回DATE、DATETIME、TIMESTAMP或TIMESTAMP_NTZ类型,与输入date参数数据类型一致。返回规则如下:
date数据类型非DATE、DATETIME、TIMESTAMP或TIMESTAMP_NTZ类型时,则返回报错。
date值为NULL时,返回报错。
delta或datepart值为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。2005年2月没有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数据类型版本,若date非DATE、DATETIME、TIMESTAMP或TIMESTAMP_NTZ类型,需要进行类型转换,否则会报错。
SELECT DATEADD(CAST('2005-03-30 00:00:00' AS datetime), -1, 'mm'); -- 返回结果。 +------------+ | _c0 | +------------+ | 2005-02-28 00:00:00 | +------------+
对于MaxCompute1.0数据类型版本,若date为STRING类型,且格式符合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函数属于日期函数,更多日期计算、日期转换的相关函数请参见日期函数。