PostgreSQL中优化销售部门工作时段来电统计查询的方法
优化后的查询语句
SELECT SUM(CASE WHEN to_phone_number = '15125551234' THEN 1 ELSE 0 END) AS sales_all, SUM(CASE WHEN to_phone_number = '15125551234' AND EXTRACT(DOW FROM start_time) BETWEEN 1 AND 5 -- 只统计周一到周五(对应原逻辑里的8/8-8/12) AND EXTRACT(EPOCH FROM start_time::TIME)/60 BETWEEN 450 AND 1050 -- 7:30 AM 到 5:30 PM,转换成分钟数统一判断 THEN 1 ELSE 0 END) AS sales_between_business_hours FROM call_logs WHERE start_time >= '2022-08-08 00:00:00' AND start_time <= '2022-08-14 23:59:59';
核心优化思路
- 减少重复代码:原查询每个OR分支都重复写了号码判断,直接把
to_phone_number = '15125551234'放在CASE最前面,一次判断即可;因为只有单个号码,用=代替IN更简洁。 - 统一工作时段判断:不用逐天写日期+时间范围,把时间转换成分钟数(7:30=450分钟,17:30=1050分钟),通过提取时间部分的分钟总量,直接判断是否在目标区间。
- 可选工作日筛选:原查询只统计周一到周五的工作时段,所以加上
EXTRACT(DOW FROM start_time) BETWEEN 1 AND 5(PostgreSQL中DOW=0为周日,1-5对应周一到周五),如果业务允许统计周末,删掉这个条件即可。 - 规范日期格式:使用
YYYY-MM-DD HH:MI:SS这种PostgreSQL更兼容的日期格式,避免解析出错。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

