跳到主要内容

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真题

交流微信二维码

你可能还想看