如何在SSRS中对表达式字段求和并统计人员在岗时长
在SSRS中统计每日/每周在岗总时长的实现方法
嘿,我来帮你搞定这个SSRS里的时长求和问题!你的需求是基于给定的TimeTable数据统计人员每日、每周的在岗总时长,核心难点在于PeriodDiff是HH:mm格式的字符串,没法直接用SUM函数计算,得先把它转换成可累加的数值类型,汇总后再转回时分格式展示。下面是具体的操作步骤:
一、先明确数据示例
你的原始TimeTable数据如下:
| Person | Week | Date | EnterTime | ExitTime | PeriodDiff |
|---|---|---|---|---|---|
| John | 1 | 01.01.2018 | 09:15 | 10:35 | 1:20 |
| John | 1 | 01.01.2018 | 10:55 | 12:23 | 1:28 |
| John | 1 | 01.01.2018 | 13:00 | 17:35 | 4:35 |
| John | 1 | 02.01.2018 | 09:00 | 16:35 | 7:35 |
| John | 2 | 08.01.2018 | 09:05 | 11:40 | 2:35 |
| John | 2 | 08.01.2018 | 16:15 | 19:35 | 3:20 |
| John | 2 | 09.01.2018 | 10:50 | 21:57 | 11:07 |
二、SSRS报表内的实现步骤
1. 将PeriodDiff转换为可计算的总分钟数
因为字符串格式的时长无法直接求和,我们需要先把HH:mm拆成小时和分钟,计算成总分钟数:
=CInt(Split(Fields!PeriodDiff.Value, ":")(0)) * 60 + CInt(Split(Fields!PeriodDiff.Value, ":")(1))
这个表达式的逻辑是:用Split拆分冒号前后的小时和分钟,转成整数后,小时乘以60加上分钟,得到该条记录的在岗总分钟数。
2. 按日期/周分组并求和
在SSRS报表设计器中:
- 先添加周分组:基于
Week字段创建组; - 在周分组内添加日分组:基于
Date字段创建组; - 在日分组的汇总行,使用SUM函数计算当日总分钟数:
=SUM(CInt(Split(Fields!PeriodDiff.Value, ":")(0)) * 60 + CInt(Split(Fields!PeriodDiff.Value, ":")(1))) - 在周分组的汇总行,用同样的SUM表达式,即可得到该周的总分钟数。
3. 将总分钟数转回HH:mm格式展示
得到总分钟数后,需要转换回用户熟悉的时分格式,用下面的表达式:
=Floor(SUM(CInt(Split(Fields!PeriodDiff.Value, ":")(0)) * 60 + CInt(Split(Fields!PeriodDiff.Value, ":")(1))) / 60) & ":" & Format(SUM(CInt(Split(Fields!PeriodDiff.Value, ":")(0)) * 60 + CInt(Split(Fields!PeriodDiff.Value, ":")(1))) Mod 60, "00")
逻辑说明:
Floor(总分钟数/60):取整得到总小时数;总分钟数 Mod 60:得到剩余的分钟数;Format(..., "00"):确保分钟数是两位数字(比如5分钟显示为05)。
三、更高效的备选方案:提前在SQL查询中处理数据
如果你的数据源是SQL Server,建议直接在查询阶段就计算出总分钟数,这样SSRS里的表达式会更简洁,性能也更好:
SELECT Person, Week, Date, EnterTime, ExitTime, PeriodDiff, -- 直接计算每条记录的在岗分钟数 DATEDIFF(MINUTE, CONVERT(DATETIME, Date + ' ' + EnterTime, 104), CONVERT(DATETIME, Date + ' ' + ExitTime, 104)) AS TotalMinutes FROM YourTimeTable
之后在SSRS里,直接用SUM(Fields!TotalMinutes.Value)就能得到汇总的分钟数,再用同样的时分转换表达式展示即可。
内容的提问来源于stack exchange,提问作者Aasimon
相关产品推荐
相关产品推荐

