我有一个表为用户存储聊天消息.每个消息都记录在此表中.我必须计算特定用户的聊天持续时间.
由于用户可能在x时间聊天,并且在x 10次之后他离开聊天.在X 20次之后,用户再次开始聊天.因此,不应考虑x 10和x 20之间的时间段.
表结构和样本数据如图所示.不同的颜色代表同一用户的两个聊天会话.我们可以看到在663和662之间存在超过1小时的差异,因此应该从结果集中排除这些会话.最终结果应该是2.33分钟.
declare @messagetime1 as datetime
declare @messagetime2 as datetime
select @messagetime1=messagetime from tbl_chatMessages where ID=662
select @messagetime2=messagetime from tbl_chatMessages where ID=659
print datediff(second,@messagetime2,@messagetime1)
Result --- 97 seconds
declare @messagetime3 as datetime
declare @messagetime4 as datetime
select @messagetime3=messagetime from tbl_chatMessages where ID=668
select @messagetime4=messagetime from tbl_chatMessages where ID=663
print datediff(second,@messagetime4,@messagetime3)
Result -- 43 seconds
请建议一个计算聊天时间的解决方案.这是我能想到的逻辑之一,以防你们中的任何一个人有更好的想法.请与解决方案分享
最佳答案 首先需要计算相邻消息之间的差距,如果差距超过600秒,那么这些消息之间的时间为0
SELECT SUM(o.duration) / 60.00 AS duration
FROM dbo.tbl_chatMessages t1
OUTER APPLY (
SELECT TOP 1
CASE WHEN DATEDIFF(second, t2.messageTime, t1.messageTime) > 600
THEN 0
ELSE DATEDIFF(second, t2.messageTime, t1.messageTime) END
FROM dbo.tbl_chatMessages t2
WHERE t1.messageTime > t2.messageTime
ORDER BY t2.messageTime DESC
) o(duration)
请参阅SQLFiddle
上的演示