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

如何使用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函数才会计算每个分组内的工时总和,而不是把全表的工时加在一起。
  • 时间处理逻辑优化:
    1. 先把[Time]字段转成DATETIME类型,用DATEDIFF(millisecond, 0, ...)将时间转换为从0点开始的毫秒数——这样才能用SUM函数对时间进行求和(直接对时间类型求和会报错)。
    2. 用DATEADD(millisecond, SUM(...), 0)把总毫秒数转回时间格式。
    3. 最后用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:16:10