如何通过SQL根据记录完成时间判定所属班次?求实现方案
问题解答
当前思路的问题
你写的case shift是错误的——shift是我们要计算生成的字段,不是数据表中已有的字段,正确逻辑应该基于complete_date的小时部分来判断所属班次。
最优实现方法
核心逻辑是提取complete_date的小时数,按班次时间范围匹配:
- 6:00-14:00(6am到2pm)→ 1班
- 14:00-22:00(2pm到10pm)→ 2班
- 22:00-次日6:00(10pm到6am)→3班
不同数据库的时间函数语法略有差异,以下是主流数据库的实现:
MySQL/MariaDB
SELECT order_num, test_iteration, complete_date, CASE WHEN HOUR(complete_date) BETWEEN 6 AND 13 THEN 1 WHEN HOUR(complete_date) BETWEEN 14 AND 21 THEN 2 ELSE 3 END AS shift FROM your_table;
PostgreSQL
SELECT order_num, test_iteration, complete_date, CASE WHEN EXTRACT(HOUR FROM complete_date) BETWEEN 6 AND 13 THEN 1 WHEN EXTRACT(HOUR FROM complete_date) BETWEEN 14 AND 21 THEN 2 ELSE 3 END AS shift FROM your_table;
SQL Server
SELECT order_num, test_iteration, complete_date, CASE WHEN DATEPART(HOUR, complete_date) BETWEEN 6 AND 13 THEN 1 WHEN DATEPART(HOUR, complete_date) BETWEEN 14 AND 21 THEN 2 ELSE 3 END AS shift FROM your_table;
为什么这是最优方案
- 性能高效:直接提取时间的小时部分做范围判断,计算逻辑简单,若
complete_date字段有索引,还能进一步提升查询速度。 - 可读性强:逻辑清晰直观,后续维护容易理解。
- 兼容性好:基于标准时间函数,适配绝大多数主流数据库,仅需微调函数语法即可迁移。
内容的提问来源于stack exchange,提问作者Sa Rod
相关产品推荐
相关产品推荐

