查找每个用户的登录和注销之间的持续时间

时间:2015-10-22 09:07:53

标签: sql datetime

状态1表示登录,状态0表示登出。如何在每个用户的登录和注销之间找到每个持续时间的总和?

这是表格

user_id时间状态

11              2015-10-21 10:00:00         1       
11              2015-10-21 10:14:00         0              
3              2015-10-21 12:30:00         1       
4              2015-10-21 12:45:00         0       

2 个答案:

答案 0 :(得分:0)

鉴于所有数据都有效,您可以试试这个沙箱示例:

select a.uid, a.d, b.d, min(timediff(b.d, a.d)) from (
    select 55 as uid, '2015-10-21 08:00:00' as d, 1 as lflag
    union all
    select 55 as uid,  '2015-10-21 09:00:00' as d, 0 as lflag   
    union all
    select 55 as uid,  '2015-10-21 12:00:00' as d, 1 as lflag  
    union all
    select 55 as uid,  '2015-10-21 14:00:00' as d, 0 as lflag   
) a
left join (
    select 55 as uid, '2015-10-21 08:00:00' as d, 1 as lflag
    union all
    select 55 as uid,  '2015-10-21 09:00:00' as d, 0 as lflag         
    union all
    select 55 as uid,  '2015-10-21 12:00:00' as d, 1 as lflag  
    union all
    select 55 as uid,  '2015-10-21 14:00:00' as d, 0 as lflag   
) b
on (a.uid=b.uid and a.lflag=1 and b.lflag = 0)
where timediff(b.d, a.d) > 0
group by a.uid, a.d

这给出了输出:

55 2015-10-21 08:00:00  2015-10-21 09:00:00 01:00:00
55 2015-10-21 12:00:00  2015-10-21 14:00:00 02:00:00

答案 1 :(得分:0)

试试这样:

SELECT tbl.UserID,tbl.Dt,(SELECT TOP 1 x.Dt 
                          FROM YourTable AS x 
                          WHERE x.UserID=tbl.UserID AND LogStatus=0 AND x.Dt>tbl.Dt 
                          ORDER BY Dt ASC)
FROM YourTable AS tbl
WHERE tbl.LogStatus=1
ORDER BY tbl.UserId,tbl.Dt;  
相关问题