如何使用SQL TIME数据类型按活动统计各部门每周工时总和?
按周统计各部门各活动工时总和的SQL解决方案
看起来你已经在搭建按周统计各部门各活动工时的查询了,不过现有语句里缺少了关键的分组逻辑,我帮你修正并优化一下,让它能正确输出你想要的统计结果:
完整查询语句
SELECT Departmentname, Week, Activity, -- 格式化总工时为 hh:mm 格式(若需要保留秒可去掉 SUBSTRING) SUBSTRING( CAST( CONVERT( TIME, DATEADD(millisecond, SUM(DATEDIFF(millisecond, 0, CAST([Time] AS DATETIME))), 0), 108 ) AS CHAR(8) ), 1, 5) AS TotalHours FROM Time WHERE Week LIKE '2024-W%' -- 根据你的需求调整周的筛选规则,比如特定年份或周范围 GROUP BY Departmentname, Week, Activity -- 核心:按部门、周、活动分组统计 ORDER BY Departmentname, Week, Activity;
关键调整说明
- 必须添加
GROUP BY子句:这是你现有代码最核心的缺失项。只有按Departmentname、Week、Activity这三个维度分组,SUM函数才会计算每个分组内的工时总和,而不是把全表的工时加在一起。 - 时间处理逻辑优化:
- 先把
[Time]字段转成DATETIME类型,用DATEDIFF(millisecond, 0, ...)将时间转换为从0点开始的毫秒数——这样才能用SUM函数对时间进行求和(直接对时间类型求和会报错)。 - 用
DATEADD(millisecond, SUM(...), 0)把总毫秒数转回时间格式。 - 最后用
CONVERT(TIME, ..., 108)格式化为hh:mm:ss字符串,再通过SUBSTRING截取前5位得到简洁的hh:mm格式总工时。
- 先把
- 灵活调整筛选条件:
WHERE子句里的Week LIKE可以根据实际需求修改,比如查询特定季度的周(LIKE '2024-W1[0-2]'),或者所有年份的特定周(LIKE '%-W05')。
如果你的[Time]字段本身就是DATETIME类型,还可以去掉CAST([Time] AS DATETIME)这一步,简化时间求和的代码:
SUM(DATEDIFF(millisecond, 0, [Time]))
另外要说明的是,这个方案支持总工时超过24小时的情况(比如统计结果显示25:30),SQL Server的TIME类型本身支持超过24小时的数值,不用担心溢出问题。
内容的提问来源于stack exchange,提问作者Tony Batista
相关产品推荐
相关产品推荐

