状态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
答案 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;