SQL 方言通

首页 / 日期

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 传负数。官方文档

迁移注意事项

示例

取业务日期的前一天,常用于 T-1 分区

MaxCompute
SELECT DATE_SUB(biz_date, 1) FROM orders;
Hologres
SELECT biz_date - interval '1 day' FROM orders;
StarRocks
SELECT DATE_SUB(biz_date, INTERVAL 1 DAY) FROM orders;
Doris
SELECT DATE_SUB(biz_date, INTERVAL 1 DAY) FROM orders;
Hive
SELECT date_sub(biz_date, 1) FROM orders;
Spark SQL
SELECT date_sub(biz_date, 1) FROM orders;
Flink SQL
SELECT TIMESTAMPADD(DAY, -1, biz_time) FROM orders;

同类函数

最后核对日期: