date_sub:日期减法
速查结论
date_sub(start_date, num_days) 是 Spark SQL 中用于计算 N 天前日期的函数。返回 start_date 减去 num_days 天后的日期。注意:num_days 必须是非负整数,如需加天数请使用 date_add。
语法
date_sub(start_date, num_days)
参数说明
| 参数 | 说明 |
|---|---|
start_date | 起始日期(DATE 或可转换为 DATE 的字符串) |
num_days | 要减去的天数(非负整数) |
返回值:start_date 往前推 num_days 天的日期(DATE 类型)。
Since: 1.5.0
示例
基础用法
-- 往前推1天
SELECT date_sub('2016-07-30', 1);
-- 结果: 2016-07-29
-- 往前推7天
SELECT date_sub('2016-07-30', 7);
-- 结果: 2016-07-23
实际业务场景
-- 计算7天前的日期
SELECT date_sub(current_date(), 7) AS last_week;
-- 筛选最近7天的数据
SELECT *
FROM orders
WHERE order_date >= date_sub(current_date(), 7);
date_sub vs date_add vs add_months 对比
| 函数 | 操作 | 参数 | 适用场景 |
|---|---|---|---|
date_sub(date, n) | 日期减 n 天 | n 为非负整数 | 计算 N 天前 |
date_add(date, n) | 日期加 n 天 | n 为非负整数 | 计算 N 天后 |
add_months(date, n) | 日期加 n 个月 | n 可为负数 | 计算 N 月前/后 |
-- 对比三种日期运算
SELECT
date_sub('2016-07-30', 1) AS one_day_before, -- 2016-07-29
date_add('2016-07-30', 1) AS one_day_after, -- 2016-07-31
add_months('2016-07-30', 1) AS one_month_after; -- 2016-08-30
常见报错与避坑指南
num_days 为负数
date_sub 的 num_days 应为非负整数,负数可能导致意外结果或报错。如需加天数,请使用 date_add。
-- 错误写法:负数天数
SELECT date_sub('2016-07-30', -1);
-- 可能导致意外结果
-- 正确写法:加天数用 date_add
SELECT date_add('2016-07-30', 1);
-- 结果: 2016-07-31
字符串格式需符合日期规范
start_date 为字符串时必须能被 Spark 正确解析为日期,否则返回 NULL。
-- 错误写法:格式不支持
SELECT date_sub('07/30/2016', 1);
-- 可能返回 NULL
-- 正确写法:使用标准格式 yyyy-MM-dd
SELECT date_sub('2016-07-30', 1);
-- 结果: 2016-07-29
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

💬加群交流
备注「数据仓库技术」加入社群,每日一道大厂SQL真题
