代码之家  ›  专栏  ›  技术社区  ›  Janis Veinbergs

计算不同行上两个日期之间的时间间隔

  •  1
  • Janis Veinbergs  · 技术社区  · 15 年前

    我有登录和注销事件,我需要计算它们之间的时间。

    我需要查询的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>
    

    谢谢你。

    1 回复  |  直到 15 年前
        1
  •  4
  •   LJW    15 年前

    鉴于SQL没有任何聚合差异方法,我建议将表连接到自身,并从连接的每一侧选择您要查找的每一行。

    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;
    


    编辑:更新以适应新提供的信息。

    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             
                };