代码之家  ›  专栏  ›  技术社区  ›  DasBooten

在同一个表中检索两条记录,并在一个查询中获取datediff

  •  2
  • DasBooten  · 技术社区  · 11 年前

    我有这张桌子

    sessionid | serviceid | requesttimestamp | etc..
    

    我的目标是获取一个用于登录和注销的serviceid,为了便于讨论,我们将其设置为2和3。因此,当两个记录有一个登录和注销时,我希望确保sessionid相同,然后对时间戳进行datediff,以确定用户已登录多长时间。我还需要一个条件,即如果登录的serviceid存在于一个记录,而注销的serviceid不存在,则在结果中跳过该记录。我想知道是否有一种神奇的方法可以在一个查询中组合这一点,到目前为止我已经做到了

    Declare @sessionStart DATETIME , @sessionStart2 as DATETIME
    set @sessionStart = (select  requesttimestamp from logentry where serviceid=151 and sessionid = '1234')
    set @sessionStart2 = (select requesttimestamp from logentry where serviceid=202 and sessionid = '1234')
    
    
    select datediff(mi, @sessionStart, @sessionStart2 );
    

    这使我在不进行空检查的情况下返回了所需的结果,我一直在研究简单的case语句,但如果可能的话,我正在尝试将其转换为一个查询。任何指向正确方向的指针都很棒

    1 回复  |  直到 11 年前
        1
  •  3
  •   Kahn    11 年前

    有点令人困惑的解释。:)但换言之,我理解的方式是,您只需要每个会话的登录时间的总分钟数。您的会话ID是否独特?此外,您已经标记了MYSQL和SQL Server,而您的语法是SQL Server。

    IE,那么是这样吗?

    SELECT L1.sessionid, DATEDIFF(MI, L1.requesttimestamp, L2.requesttimestamp) LOG_TIME_IN_MINUTES
    FROM logentry L1
    JOIN logentry L2 ON L2.sessionid  = L1.sessionid
    WHERE L1.requesttimestamp IS NOT NULL AND L2.requesttimestamp IS NOT NULL
    AND L1.serviceid = 2 AND L2.serviceid = 3