首页 / 日期
DATE_ADD 日期加减
DATE_ADD 给日期加上若干天。函数名相同,但 MaxCompute、Hive 和 Spark 直接传天数,StarRocks 和 Doris 要写 INTERVAL;返回类型也不同,MaxCompute 返回 DATE 并丢掉时间部分。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | DATE_ADD(startdate, delta) |
按天加减,delta 为负数时表示减。返回 DATE,输入的时间部分会被丢弃。需要按月、小时等单位加减时用 DATEADD。 | 官方文档 |
| Hologres | 需改写 | DATEADD(d, num, 'day') |
文档中没有 DATE_ADD,可以用 DATEADD 或 d + interval。DATEADD 需要 V2.0.31~V2.1.0 或 V2.1.13 及以上版本。 | 官方文档 |
| StarRocks | 支持 | DATE_ADD(date, INTERVAL n DAY) |
文档只列出 INTERVAL 写法。返回 DATETIME,DATE 输入也会转成 DATETIME。结果日期不存在时返回 NULL。 | 官方文档 |
| Doris | 支持 | DATE_ADD(date, INTERVAL n DAY) |
别名有 days_add 和 adddate。单位支持 YEAR、MONTH、DAY、HOUR、MINUTE、SECOND。 | 官方文档 |
| Hive | 支持 | date_add(startdate, days) |
Hive 2.1.0 之前返回 string,之后返回 date。 | 官方文档 |
| Spark SQL | 支持 | date_add(start_date, num_days) |
Spark 1.5.0 起提供。3.4.0 起另有同义的 dateadd。 | 官方文档 |
| Flink SQL | 需改写 | TIMESTAMPADD(DAY, n, timepoint) |
内置函数中没有 DATE_ADD,改用 TIMESTAMPADD。 | 官方文档 |
迁移注意事项
- MaxCompute 的 DATE_ADD 返回 DATE,DATE_ADD(DATETIME '2005-02-28 10:00:00', 1) 的结果不带时间。需要保留时间时改用 DATEADD(d, 1, 'dd'),它的返回类型与输入相同。
- MaxCompute 的 DATEADD 按月加时,目标月份没有对应日期会返回当月最后一天,例如 1 月 29 日加 1 个月得到 2 月 28 日。StarRocks 的 DATE_ADD 遇到不存在的日期返回 NULL。
- StarRocks 的 DATE_ADD 即使输入是 DATE,也会返回 DATETIME。写入 DATE 列或与 DATE 比较时注意类型。
- Hive 2.1.0 之前 date_add 返回字符串,老版本迁移来的 SQL 可能依赖了这个行为。
示例
取次日日期
SELECT DATE_ADD(biz_date, 1) FROM orders;SELECT DATEADD(biz_date, 1, 'day') FROM orders;SELECT DATE_ADD(biz_date, INTERVAL 1 DAY) FROM orders;SELECT date_add(biz_date, 1) FROM orders;SELECT TIMESTAMPADD(DAY, 1, biz_time) FROM orders;