2009-12-03 2 views
1

У меня есть события входа и выхода из системы, и мне нужно рассчитать время между ними.Вычислить временной интервал между двумя датами в разных строках

Я думаю, я мог бы группировать каждые 2 строки (каждое два сообщения), а затем выполнять вычисления, но как бы вы это сделали?

Пример XML мне нужно запросить:

<Log> 
    <Message> 
    <DateTime>2009-12-02 14:38:41</DateTime> 
    <Priority>Local3.Info</Priority> 
    <Source_Host>192.168.0.100</Source_Host> 
    <MessageText>Dec 2 14:38:41 root: login,ng1,192.168.0.160,janis.veinbergs</MessageText> 
    </Message> 
    <Message> 
    <DateTime>2009-12-02 15:28:19</DateTime> 
    <Priority>Local3.Info</Priority> 
    <Source_Host>192.168.0.100</Source_Host> 
    <MessageText>Dec 2 15:30:33 root: logout,ng1,,janis.veinbergs</MessageText> 
    </Message> 
    <Message> 
    <DateTime>2009-12-02 15:29:11</DateTime> 
    <Priority>Local3.Info</Priority> 
    <Source_Host>192.168.0.100</Source_Host> 
    <MessageText>Dec 2 15:31:25 root: login,ng1,192.168.0.160,janis.veinbergs</MessageText> 
    </Message> 
    <Message> 
    <DateTime>2009-12-02 15:58:22</DateTime> 
    <Priority>Local3.Info</Priority> 
    <Source_Host>192.168.0.100</Source_Host> 
    <MessageText>Dec 2 16:00:37 root: logout,ng1,,janis.veinbergs</MessageText> 
    </Message> 
</Log> 

Thankyou.

ответ

4

У данного SQL не существует какого-либо агрегированного метода Diff, я бы предложил присоединиться к таблице на себя и выбрать каждую строку, с которой вы следуете с каждой стороны соединения.

Что-то вроде:

var diff = from a in db.Events 
      join b in db.Events on a.SessionId equals b.SessionId 
      where a.EventType == 'Login' && b.EventType == 'Logout' 
      select b.EventTime - a.EventTime; 

Не пробовал, но что-то вдоль этих линий должны работать.


EDIT: обновленный в соответствии с новыми данными.

Попробуйте следующее. Может быть, он был более кратким, но выполняет эту работу. Разделились на несколько запросов для упрощения чтения.

var query = from a in (from log in data.Elements() 
         select new { 
          date = DateTime.Parse(log.Element("DateTime").Value), 
          msg = log.Element("MessageText").Value 
         }) 
      select new { 
       a.date, 
       type = a.msg.Contains("login") ? "Login" : "Logout", 
       user = a.msg.Substring(a.msg.LastIndexOf(',') + 1) 
      }; 

var results = from a in query 
      join b in query on a.user equals b.user 
      where a.type == "Login" && b.type == "Logout" 
       && b.date == (query.OrderBy(o => o.date).Where(d => d.date > a.date).FirstOrDefault().date) 
      select new { 
       a.user, 
       Login = a.date, 
       Logout = b.date    
      }; 
+0

Умм, для меня нет колонки идентификаторов. См. Мое редактирование, например, запрос XML i'm. –

+0

Обновлено в соответствии с предоставленным XML – Marcus

+0

Спасибо. Код не работал напрямую (data.Elements()) не возвращает никаких результатов, но я скорректировал, и важной частью для его работы был запрос, используемый для возврата переменной «results». спасибо. –

Смежные вопросы