PostgreSQL指定日期区间内时段出租车订单统计需求咨询
解决PostgreSQL中特定日期区间+每日时段的订单统计问题
嘿,你的需求用date_trunc完全能搞定,甚至结合几个简单的函数就能精准实现统计!我来给你一步步说明:
先明确假设的表结构
假设你的出租车订单表名为taxi_orders,核心字段是pickup_time(订单上车时间,你也可以换成下单时间/下车时间,根据实际业务调整)。
核心SQL示例
下面的代码会统计2024年3月5日至3月27日期间,每日00:00-03:00的订单总量:
SELECT -- 把时间截断到“天”,也可以转成更友好的YYYY-MM-DD格式 TO_CHAR(date_trunc('day', pickup_time), 'YYYY-MM-DD') AS order_date, COUNT(*) AS total_orders FROM taxi_orders WHERE -- 过滤指定日期区间:左闭右开写法,避免遗漏毫秒级数据 pickup_time >= '2024-03-05 00:00:00' AND pickup_time < '2024-03-28 00:00:00' -- 筛选每日00:00-03:00的时段(包含0/1/2点,3:00整属于下一个时段) AND EXTRACT(HOUR FROM pickup_time) BETWEEN 0 AND 2 GROUP BY date_trunc('day', pickup_time) -- 按日期排序,结果更清晰 ORDER BY order_date;
关键部分解释
date_trunc('day', pickup_time):这正是你提到的函数,它会把任意时间戳截断到当天的起始时刻(比如2024-03-05 14:30:00会变成2024-03-05 00:00:00),完美用来按日分组统计。EXTRACT(HOUR FROM pickup_time):提取时间戳中的小时数,用来筛选你需要的特定时段。如果你的时段是比如早高峰07:00-10:00,就把条件改成BETWEEN 7 AND 9即可。- 日期区间的写法:用
< '2024-03-28'代替<= '2024-03-27 23:59:59'是更严谨的做法——因为如果订单时间带有毫秒(比如2024-03-27 23:59:59.999),后者会漏掉这些数据,而前者能包含3月27日全天的所有订单。
扩展:如果需要统计多个时段
要是你想同时统计多个时段(比如凌晨、早高峰、晚高峰),可以用CASE语句来分组:
SELECT TO_CHAR(date_trunc('day', pickup_time), 'YYYY-MM-DD') AS order_date, CASE WHEN EXTRACT(HOUR FROM pickup_time) BETWEEN 0 AND 2 THEN '00:00-03:00' WHEN EXTRACT(HOUR FROM pickup_time) BETWEEN 7 AND 9 THEN '07:00-10:00' WHEN EXTRACT(HOUR FROM pickup_time) BETWEEN 17 AND 19 THEN '17:00-20:00' ELSE '其他时段' END AS time_slot, COUNT(*) AS total_orders FROM taxi_orders WHERE pickup_time >= '2024-03-05' AND pickup_time < '2024-03-28' GROUP BY order_date, time_slot ORDER BY order_date, time_slot;
内容的提问来源于stack exchange,提问作者banbar
相关产品推荐
相关产品推荐

