You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中最近30天完成行程ETA差值90分位数计算及日期验证

关于SQL中筛选最近30天条件的正确性分析

问题背景

现有一张存储出租车行程数据的SQL表,表结构如下:

id            integer
client_id     integer (外键关联至events.rider_id)
driver_id     integer
city_id       integer (外键关联至cities.city_id)
client_rating integer
driver_rating integer
predicted_eta integer
actual_eta    integer
first_completed_date Timestamp,
status        Enum('completed', 'cancelled_by_driver', 'cancelled_by_client')

需求:计算最近30天内所有已完成行程的Actual ETA与Predicted ETA差值的90分位数,给出的SQL语句如下:

select
  percentile_cont(0.90) within group (order by actual_eta-predicted_eta) as percentile_90_diff
from trips t where status='completed'
and first_completed_date > (first_completed_date - INTERVAL '30 DAY')::DATE

疑问:语句中筛选最近30天的条件first_completed_date > (first_completed_date - INTERVAL '30 DAY')::DATE是否正确?

条件正确性分析

这个筛选条件完全错误,根本无法实现“筛选最近30天数据”的效果。

原因很直接:对于任意一条数据的first_completed_date值,first_completed_date - INTERVAL '30 DAY'必然是一个比当前字段值早30天的时间,因此first_completed_date > (first_completed_date - INTERVAL '30 DAY')::DATE这个条件永远为真,相当于没有添加任何时间筛选规则,会把所有已完成的行程都纳入计算,完全不符合需求。

正确的筛选方式

要筛选最近30天的已完成行程,需要基于当前时间做时间范围判断,常见的正确写法有两种:

  1. 保留时分秒精度的精确筛选:
first_completed_date >= CURRENT_TIMESTAMP - INTERVAL '30 DAY'
  1. 仅基于日期维度的筛选(忽略时分秒):
first_completed_date::DATE >= CURRENT_DATE - INTERVAL '30 DAY'

如果业务涉及多时区场景,建议明确指定时区(例如CURRENT_TIMESTAMP AT TIME ZONE 'Asia/Shanghai'),避免时区偏差导致的筛选结果错误。

内容的提问来源于stack exchange,提问作者ERJAN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:32:42