跳到主要内容

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 - startINTERVAL天-时-分-秒需要精确时间差
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真题

交流微信二维码

你可能还想看