如何计算T-SQL

时间:2018-04-27 01:27:09

标签: sql sql-server entity-framework tsql

我有一个名为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 enter image description here

Sample Data Link for test.bak

1 个答案:

答案 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