首页 / 日期
DATE_SUB 日期减天数
DATE_SUB 从日期中减去若干天。MaxCompute、Hive 和 Spark 直接传天数,StarRocks 和 Doris 要写 INTERVAL,Hologres 和 Flink 没有这个函数。返回类型也不同,StarRocks 返回 DATETIME,MaxCompute 返回 DATE。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | DATE_SUB(startdate, delta) | delta 大于 0 时减,小于 0 时加。返回 DATE,输入的时间部分会被丢弃。startdate 为 NULL 时报错,delta 为 NULL 时返回 NULL。 | 官方文档 |
| Hologres | 需改写 | d - interval '1 day' | 文档中没有 DATE_SUB。可以用日期减 interval,也可以写 DATEADD(d, -n, 'dd')。DATEADD 需要 V2.0.31~V2.1.0 或 V2.1.13 及以上版本。 | 官方文档 |
| StarRocks | 支持 | DATE_SUB(date, INTERVAL n DAY) | 别名 subdate。返回 DATETIME。结果日期不存在时返回 NULL,例如 2010-02-30。只传天数时可以用 days_sub(d, n)。 | 官方文档 |
| Doris | 支持 | DATE_SUB(date, INTERVAL n DAY) | 别名有 days_sub 和 subdate。单位支持 YEAR、MONTH、DAY、HOUR、MINUTE、SECOND。 | 官方文档 |
| Hive | 支持 | date_sub(startdate, days) | Hive 2.1.0 之前返回 string,之后返回 date。 | 官方文档 |
| Spark SQL | 支持 | date_sub(start_date, num_days) | Spark 1.5.0 起提供。 | 官方文档 |
| Flink SQL | 需改写 | TIMESTAMPADD(DAY, -n, timepoint) | 内置函数中没有 DATE_SUB,用 TIMESTAMPADD 传负数。 | 官方文档 |
迁移注意事项
- StarRocks 的 DATE_SUB 即使输入是 DATE,也返回 DATETIME。结果用于分区过滤或与 DATE 字段比较时,注意类型是否一致。
- MaxCompute 的 DATE_SUB 返回 DATE,会丢掉时间部分。需要保留时间时改用 DATEADD(d, -1, 'dd')。
- MaxCompute 的 DATE_SUB 遇到 startdate 为 NULL 会报错,而不是返回 NULL。
- StarRocks 和 Doris 的 DATE_SUB 文档只列出 INTERVAL 写法。把 Hive 的 date_sub(d, 1) 搬到 StarRocks 时,改成 DATE_SUB(d, INTERVAL 1 DAY) 或 days_sub(d, 1)。
示例
取业务日期的前一天,常用于 T-1 分区
SELECT DATE_SUB(biz_date, 1) FROM orders;SELECT biz_date - interval '1 day' FROM orders;SELECT DATE_SUB(biz_date, INTERVAL 1 DAY) FROM orders;SELECT DATE_SUB(biz_date, INTERVAL 1 DAY) FROM orders;SELECT date_sub(biz_date, 1) FROM orders;SELECT date_sub(biz_date, 1) FROM orders;SELECT TIMESTAMPADD(DAY, -1, biz_time) FROM orders;