Как рассчитать временные интервалы между событиями в T-SQL - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть таблица с именем 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

Пример ссылки на данные для test.bak

1 Ответ

0 голосов
/ 27 апреля 2018

Если я правильно понимаю, вам нужно использовать 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...