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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:33:57