SQL Server重复行求和问题:通话时间字段无法实现求和
搞定SQL Server里重复行求和+时间字段累加的问题
嘿,我明白你的需求了——现在你已经能让TSEC和TMIN字段按重复行求和,但卡在了Talk Time这个时间类型的字段上,还要给结果行加上时间戳对吧?这就给你捋清楚怎么弄:
先搞懂核心问题:时间字段不能直接SUM
TSEC和TMIN是数值型,直接用SUM()就行,但Talk Time是时间格式(不管是time类型还是HH:MM:SS字符串),直接SUM会报错,得先转成可计算的数值(比如总秒数),求和后再转回时间格式。
完整SQL示例(按你的场景适配)
假设你的表叫YourSessionTable,需要按用户ID、日期这类字段分组(你换成自己实际的分组字段就行),要加的时间是当前系统时间,那代码这么写:
SELECT GETDATE() AS RecordAddTime, -- 给结果行添加当前时间戳 UserID, -- 你的分组字段1,替换成实际字段名 CONVERT(DATE, SessionStartTime) AS SessionDate, -- 分组字段2,按天分组示例 SUM(TSEC) AS TotalTSEC, -- 数值字段直接求和 SUM(TMIN) AS TotalTMIN, -- 重点:处理Talk Time的累加逻辑 CONVERT(VARCHAR(8), DATEADD(SECOND, SUM( DATEDIFF(SECOND, '00:00:00', CONVERT(TIME, TalkTime)) ), '00:00:00'), 108) AS TotalTalkTime FROM YourSessionTable GROUP BY UserID, CONVERT(DATE, SessionStartTime)
这段代码的逻辑拆解:
DATEDIFF(SECOND, '00:00:00', CONVERT(TIME, TalkTime)):把Talk Time转成标准time类型,再算出它对应的总秒数(比如01:30:00就是5400秒)SUM(...):把同一组里所有行的秒数加起来DATEADD(SECOND, 总秒数, '00:00:00'):把总秒数转回时间类型CONVERT(VARCHAR(8), ..., 108):最后格式化成HH:MM:SS的字符串,和原字段格式保持一致
如果你的Talk Time本身就是time类型,那可以去掉CONVERT(TIME, TalkTime),直接用TalkTime就行。
要是你要加的是原始行的时间而非当前时间
如果想保留每条记录的原始时间,或者按原始时间分组,那把GETDATE()换成表中已有的时间字段就行,比如:
SELECT SessionStartTime AS RecordTime, -- 用表中自带的时间字段作为记录时间 UserID, SUM(TSEC) AS TotalTSEC, SUM(TMIN) AS TotalTMIN, CONVERT(VARCHAR(8), DATEADD(SECOND, SUM( DATEDIFF(SECOND, '00:00:00', TalkTime) ), '00:00:00'), 108) AS TotalTalkTime FROM YourSessionTable GROUP BY SessionStartTime, UserID
特殊情况:Talk Time累加超过24小时怎么办?
如果你的Talk Time加起来超过一天(比如25:30:15),那time类型存不下(它最多到23:59:59),这时候得改成自定义格式显示,代码调整成这样:
SELECT GETDATE() AS RecordAddTime, UserID, SUM(TSEC) AS TotalTSEC, SUM(TMIN) AS TotalTMIN, -- 格式化为HHH:MM:SS,支持超过24小时的时长 CONCAT( FLOOR(SUM(DATEDIFF(SECOND, '00:00:00', TalkTime)) / 3600), ':', RIGHT('0' + CAST((SUM(DATEDIFF(SECOND, '00:00:00', TalkTime)) % 3600) / 60 AS VARCHAR), 2), ':', RIGHT('0' + CAST(SUM(DATEDIFF(SECOND, '00:00:00', TalkTime)) % 60 AS VARCHAR), 2) ) AS TotalTalkTime FROM YourSessionTable GROUP BY UserID
最后提醒一下
一定要确保分组字段选对了,不然会把不该合并的行合并,或者该合并的没合并,比如如果是按用户+日期分组,就别漏了日期字段哦。
内容的提问来源于stack exchange,提问作者Abdulquadir Shaikh
相关产品推荐
相关产品推荐

