我有一个名为Events的表。它有Computer_Id,User_Id,Event_Type和Event_DateTime。当用户登录到计算机时,“事件”表将获取该登录的条目,类似于从网络中的所有计算机进行注销。要求是查找计算机使用的时间或给定用户在计算机上花费的时间,或者可以计算所有计算机的使用时间,即 登录和注销之间的时间间隔,在给定的一天允许Event_DateTime> ='2018-04-26 00:00:01'和Event_DateTime> ='2018-04-26 11:59:59'的日子。技巧部分有时候登录可能没有关联注销,反之亦然。 我将非常感谢您解决此问题的见解。谢谢登录= 43和退出= 42
答案 0 :(得分:1)
如果我理解正确,您需要在子查询上使用CROSS APPLY
以获得logout
之前的最接近日期。
SELECT t1.Computer_ID,
t1.User_ID,
CONVERT(varchar, DATEADD(s, DATEDIFF(s,t1.Event_time ,t2.Event_time), 0), 108) 'castTime'
FROM T1 t1 CROSS APPLY (
SELECT TOP 1 *
FROM T1 t2
WHERE t2.EventType = 43
AND t1.Computer_ID = t2.Computer_ID
AND t1.User_ID = t2.User_ID
ORDER BY Event_time DESC
) t2
WHERE t1.EventType = 42
and t1.Event_time BETWEEN '2017/10/10' and '2017/10/11'
sqlfiddle:http://sqlfiddle.com/#!18/4703f/2
修改强>
此查询是每台计算机的计算成本总计时间。
如果这不符合您的期望,您能否提供我的sqlfiddle样本数据的预期结果?
SELECT t1.Computer_ID,
CONVERT(char(10), t1.Event_time,126) 'Dates',
Convert(VARCHAR,DATEADD(ms,SUM(DATEDIFF(ms, '00:00:00.000', castTime)),'00:00:00.000'),108) 'totleCastTime'
FROM T1 t1 CROSS APPLY (
SELECT TOP 1 *,
DATEADD(s, DATEDIFF(s,t1.Event_time,t2.Event_time), 0) 'castTime'
FROM T1 t2
WHERE t2.EventType = 43
AND t1.Computer_ID = t2.Computer_ID
ORDER BY Event_time DESC
) t2
WHERE t1.EventType = 42 and t1.Event_time BETWEEN '2017/10/10' and '2017/10/11'
GROUP BY t1.Computer_ID,
CONVERT(char(10),t1.Event_time,126)
sqlfiddle:http://sqlfiddle.com/#!18/4703f/23