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

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、周六=7
  • ELT(index, val1, val2, ...):根据输入的索引值,返回后续参数列表中对应位置的值,索引从1开始计数。

内容的提问来源于stack exchange,提问作者Matthew Barraud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:36:26