首页 / 日期
DATEDIFF 日期差
DATEDIFF 计算两个日期之间相差多少天。多数引擎都是“结束日期在前”,但 MaxCompute 和 Hologres 支持按小时、分钟等单位计算,StarRocks 和 Doris 只按天计算,Flink 需要改用 TIMESTAMPDIFF。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | DATEDIFF(end_date, start_date[, date_part]) |
结果为 end_date 减 start_date。不传 date_part 时按天计算并返回 INT,传入时返回 BIGINT。date_part 支持 yyyy、mm、dd、hh、mi、ss、ff3 等。 | 官方文档 |
| Hologres | 支持 | DATEDIFF(d1, d2, unit) |
需要 V2.0.31~V2.1.0 或 V2.1.13 及以上版本。不足一个单位时返回 0,不允许所有参数都是常量。DATE 相减也可以直接得到天数。 | 官方文档 |
| StarRocks | 支持 | DATEDIFF(expr1, expr2) |
结果为 expr1 减 expr2,只按天计算,忽略时间部分。需要其他单位时用 date_diff。 | 官方文档 |
| Doris | 支持 | DATEDIFF(expr1, expr2) |
结果为 expr1 减 expr2,按天计算。 | 官方文档 |
| Hive | 支持 | datediff(enddate, startdate) |
返回 int,表示从 startdate 到 enddate 的天数。 | 官方文档 |
| Spark SQL | 支持 | datediff(endDate, startDate) |
Spark 1.5.0 起提供。3.4.0 起另有同义的 date_diff。 | 官方文档 |
| Flink SQL | 需改写 | TIMESTAMPDIFF(DAY, timepoint1, timepoint2) |
内置函数中没有 DATEDIFF。TIMESTAMPDIFF 返回 timepoint1 与 timepoint2 之间带符号的单位数,先写单位,再写开始时间和结束时间。 | 官方文档 |
迁移注意事项
- MaxCompute、StarRocks、Doris、Hive 和 Spark 都是结束日期在前。Flink 的 TIMESTAMPDIFF 先写单位,再写开始时间和结束时间。Flink 文档没有写明正负号的方向,按标准 SQL 的约定结果为 timepoint2 减 timepoint1,迁移后建议用一条已知数据核对符号。
- StarRocks 只比较日期部分:DATEDIFF('2007-12-31 23:59:59', '2007-12-30') 返回 1,而不是按 47 小时折算。
- MaxCompute 按分钟等单位计算时,默认先截掉更小的单位再相减:10:05:05 减 10:00:10 返回 5 分钟。开启 BigQuery 兼容模式后返回 4。
- MaxCompute 2.0 类型系统下,yyyy-mm-dd 格式的字符串不能指定 date_part,否则报错。
- Hologres 的 DATEDIFF 有版本要求,V2.1.0~V2.1.12 之间的版本不支持。
示例
计算下单到支付相隔的天数
SELECT DATEDIFF(pay_time, order_time) FROM orders;SELECT DATEDIFF(pay_time, order_time, 'day') FROM orders;SELECT DATEDIFF(pay_time, order_time) FROM orders;SELECT TIMESTAMPDIFF(DAY, order_time, pay_time) FROM orders;