SQL 方言通

首页 / 日期

DATEADD 按单位加减日期

DATEADD 是 MaxCompute 的写法,可以按年、季、月、天、小时、分钟、秒加减时间,返回类型与输入相同。Hologres 同名可用;StarRocks、Doris 和 Flink 改用 TIMESTAMPADD 或 INTERVAL;Spark 的 dateadd 只能加天数,含义不同。

各引擎写法 · 迁移注意事项 · 示例

各引擎写法

引擎支持写法说明依据
MaxCompute支持DATEADD(date, delta, datepart)datepart 必须是常量,可选 yyyy、q、mm、week、dd、hh、mi、ss、ff3 等。返回类型与 date 相同。date 为 NULL 时报错,delta 或 datepart 为 NULL 时返回 NULL。2.0 数据类型版本下,字符串要先 CAST 成 DATETIME。官方文档
Hologres支持DATEADD(d, num, str)需要 V2.0.31~V2.1.0 或 V2.1.13 及以上版本。单位写法与 MaxCompute 一致,包括 yyyy、mm、dd、hh、mi、ss。默认只支持 1925~2282 年,并且暂不支持常量入参写入。官方文档
StarRocks需改写TIMESTAMPADD(unit, n, datetime_expr)单位写成关键字,例如 HOUR、DAY、MONTH,不加引号。TIMESTAMPADD 文档没有列出 QUARTER;按季度加减可以用 DATE_ADD(dt, INTERVAL n QUARTER)。官方文档
Doris需改写TIMESTAMPADD(unit, n, datetime_expr)单位常用 SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、YEAR。参数无效时返回 NULL。也可以写 DATE_ADD(dt, INTERVAL n unit)。官方文档
Hive需改写date_add(startdate, days) / add_months(startdate, n)内置函数中没有 DATEADD。按天加减用 date_add,按月加减用 add_months。官方文档
Spark SQL需改写ts + INTERVAL n HOURSpark 3.4.0 起有 dateadd(start_date, num_days),但只能加天数,没有单位参数。按小时、月等单位加减用 INTERVAL 字面量,按月也可以用 add_months。官方文档
Flink SQL需改写TIMESTAMPADD(unit, n, timepoint)单位可以是 SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、QUARTER 或 YEAR。官方文档

迁移注意事项

示例

取下单时间 2 小时后的时间

MaxCompute
SELECT DATEADD(order_time, 2, 'hh') FROM orders;
Hologres
SELECT DATEADD(order_time, 2, 'hh') FROM orders;
StarRocks
SELECT TIMESTAMPADD(HOUR, 2, order_time) FROM orders;
Doris
SELECT TIMESTAMPADD(HOUR, 2, order_time) FROM orders;
Spark SQL
SELECT order_time + INTERVAL 2 HOUR FROM orders;
Flink SQL
SELECT TIMESTAMPADD(HOUR, 2, order_time) FROM orders;

取账单日期的下一个月同一天

MaxCompute
SELECT DATEADD(bill_date, 1, 'mm') FROM bills;
Hive
SELECT add_months(bill_date, 1) FROM bills;
Spark SQL
SELECT add_months(bill_date, 1) FROM bills;
Flink SQL
SELECT TIMESTAMPADD(MONTH, 1, bill_time) FROM bills;

同类函数

最后核对日期: