首页 / 日期
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 HOUR | Spark 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。 | 官方文档 |
迁移注意事项
- MaxCompute 和 Hologres 中 mm 表示月,mi 表示分钟。把 DATEADD(d, 1, 'mm') 当成加 1 分钟,是迁移时最常见的错误。
- Spark 3.4.0 起的 dateadd(d, 1) 表示加 1 天,参数个数和含义都与 MaxCompute 不同,不能直接照搬。
- MaxCompute 的 DATEADD 遇到 date 为 NULL 会报错,而不是返回 NULL。字段可能为空时,先过滤或用 IF 包一层。
- MaxCompute 按月加减时,如果目标月份没有对应日期,结果取当月最后一天。StarRocks 的 DATE_ADD 遇到不存在的日期返回 NULL。
- Hologres 的 DATEADD 默认只支持 1925~2282 年。9999-12-31 这类表示“永久有效”的日期需要单独处理。
示例
取下单时间 2 小时后的时间
SELECT DATEADD(order_time, 2, 'hh') FROM orders;SELECT DATEADD(order_time, 2, 'hh') FROM orders;SELECT TIMESTAMPADD(HOUR, 2, order_time) FROM orders;SELECT TIMESTAMPADD(HOUR, 2, order_time) FROM orders;SELECT order_time + INTERVAL 2 HOUR FROM orders;SELECT TIMESTAMPADD(HOUR, 2, order_time) FROM orders;取账单日期的下一个月同一天
SELECT DATEADD(bill_date, 1, 'mm') FROM bills;SELECT add_months(bill_date, 1) FROM bills;SELECT add_months(bill_date, 1) FROM bills;SELECT TIMESTAMPADD(MONTH, 1, bill_time) FROM bills;