MySQL统计1个工作日内关闭工单的SQL实现方案
MySQL统计1个工作日内关闭的工单数量
需求与现有问题
- 业务库中存在工单表
helpdesk,需统计创建后1个工作日内完成关闭的工单总量 - 工作日判定规则:周五创建的工单若在周一完成关闭,仍判定为1个工作日内关闭
- 现有基础查询仅按自然日1天做间隔判断,不符合业务规则,初始语句如下:
SELECT count(*) FROM helpdesk WHERE hd_closeDateTime < hd_openDateTime + interval 1 day AND hd_status = 2
- 已知可通过
DAYOFWEEK()函数提取日期对应的星期值,但不清楚如何将星期判断逻辑整合到间隔计算中。
涉及表结构
helpdesk表核心结构如下:
CREATE TABLE `helpdesk` ( `hd_id` int(11) NOT NULL, `hd_title` varchar(255) NOT NULL, `hd_openDateTime` datetime NOT NULL, `hd_closeDateTime` datetime DEFAULT NULL, `hd_status` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
字段说明:
hd_openDateTime为工单创建时间,hd_closeDateTime为工单关闭时间,hd_status=2代表工单已关闭。
实现方案
核心思路:根据工单创建时间对应的星期,动态计算允许的最大关闭时间间隔,无需嵌套多层判断:
- 周一至周四创建的工单:最大允许间隔为1个自然日
- 周五、周六创建的工单:最大允许间隔为3个自然日(覆盖周末两天,到周一刚好在1个工作日范围内)
- 周日创建的工单:最大允许间隔为2个自然日
通过ELT()函数匹配DAYOFWEEK()返回的星期索引,直接返回对应间隔天数即可,最终可正常运行的统计SQL如下:
SELECT count(*) FROM helpdesk WHERE hd_closeDateTime < hd_openDateTime + INTERVAL ELT(DAYOFWEEK(hd_openDateTime),2,1,1,1,1,3,3) DAY AND hd_status = 2
如果需要调试核对每条工单的星期值与时间差,可使用调试语句查看明细:
SELECT *, DAYOFWEEK(hd_openDateTime) AS week_index FROM helpdesk WHERE hd_closeDateTime < hd_openDateTime + INTERVAL ELT(DAYOFWEEK(hd_openDateTime),2,1,1,1,1,3,3) DAY AND hd_status = 2
用到的函数说明
DAYOFWEEK(date):返回输入日期对应的星期索引,取值范围1-7,映射关系为:周日=1、周一=2、周二=3、周三=4、周四=5、周五=6、周六=7ELT(index, val1, val2, ...):根据输入的索引值,返回后续参数列表中对应位置的值,索引从1开始计数。
内容的提问来源于stack exchange,提问作者Matthew Barraud
相关产品推荐
相关产品推荐

