datediff:日期差计算
速查结论
datediff(endDate, startDate) 是 Spark SQL 中用于计算两个日期之间相差天数的函数。返回 endDate - startDate 的天数差。注意:参数顺序是 endDate 在前、startDate 在后,写反会导致正负号颠倒。
语法
datediff(endDate, startDate)
参数说明
| 参数 | 说明 |
|---|---|
endDate | 结束日期(DATE 或可转换为 DATE 的字符串) |
startDate | 开始日期(DATE 或可转换为 DATE 的字符串) |
返回值:endDate 减去 startDate 的天数差(INT 类型)。endDate > startDate 时为正,反之为负。
Since: 1.5.0
示例
基础日期差
-- endDate 更大:返回正数
SELECT datediff('2009-07-31', '2009-07-30');
-- 结果: 1
-- endDate 更小:返回负数
SELECT datediff('2009-07-30', '2009-07-31');
-- 结果: -1
实际业务场景
-- 计算用户注册天数
SELECT
user_id,
datediff(current_date(), register_date) AS days_since_register
FROM users;
-- 筛选最近7天内的订单
SELECT *
FROM orders
WHERE datediff(current_date(), order_date) <= 7;
-- 计算订单从创建到完成的耗时
SELECT
order_id,
datediff(completed_date, created_date) AS fulfillment_days
FROM orders;
datediff vs months_between vs 日期直接相减 对比
| 方法 | 返回类型 | 粒度 | 适用场景 |
|---|---|---|---|
datediff(end, start) | INT 天数 | 天 | 计算天数差 |
months_between(end, start) | DOUBLE 月数 | 月(带小数) | 计算月数差(如账龄) |
end - start | INTERVAL | 天-时-分-秒 | 需要精确时间差 |
SELECT
datediff('2009-07-31', '2009-06-01') AS days_diff, -- 60
months_between('2009-07-31', '2009-06-01') AS months_diff, -- 1.967...
TIMESTAMP '2009-07-31 12:00:00' - TIMESTAMP '2009-07-31 00:00:00' AS interval_diff;
-- interval_diff: 12 hours
选型建议:
- 计算天数差(如注册天数、订单周期):用
datediff - 计算月数差(如合同剩余月数):用
months_between - 需要时-分-秒级别精度:用时间戳直接相减
常见报错与避坑指南
参数顺序写反导致符号颠倒
datediff 是 endDate - startDate,不是 startDate - endDate。顺序写反会导致正负号颠倒。
-- 错误写法:顺序写反,结果符号不对
SELECT datediff('2009-07-30', '2009-07-31');
-- 结果: -1(想要1天差却得到负数)
-- 正确写法:endDate 在前
SELECT datediff('2009-07-31', '2009-07-30');
-- 结果: 1
只计算日期差,忽略时间部分
datediff 只比较日期部分,忽略时间部分。同一天内不同时间的结果为 0。
-- 同一天不同时间,datediff 返回 0
SELECT datediff('2009-07-31 23:59:59', '2009-07-31 00:00:01');
-- 结果: 0(日期相同)
-- 如需带时间的差值,用时间戳相减
SELECT CAST(
TIMESTAMP '2009-07-31 23:59:59' - TIMESTAMP '2009-07-31 00:00:01'
AS STRING
);
字符串格式需符合日期规范
日期字符串必须能被 Spark 解析为 DATE 类型,否则返回 NULL。
-- 错误写法:格式不规范
SELECT datediff('07/31/2009', '07/30/2009');
-- 可能返回 NULL
-- 正确写法:使用 yyyy-MM-dd 格式
SELECT datediff('2009-07-31', '2009-07-30');
-- 结果: 1
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

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