我想计算用户的休息时间例如(休息时间=锁定 - 解锁时间)或 (休息时间=登录 - 任务暂停)
有人可以告诉我如何计算吗?
在下面的示例中,每当EventType中断时,计算Date的下一行 - Date的下一行。如何实现?
以下是我的表
EventId EventDate EventType Userid
1 2015-11-05 13:54:28.900 Login 10
2 2015-11-05 13:55:27.527 Lock 10
3 2015-11-05 13:55:27.537 Break 10
4 2015-11-05 13:55:37.037 Unlock 10
5 2015-11-05 14:33:26.347 Login 10
6 2015-11-05 14:33:46.243 Break 10
7 2015-11-05 14:34:34.570 TaskPause 10
所需的输出将是
Userid Break_Duration(In sec)
10 10
10 68
答案 0 :(得分:0)
我创建了一个有点相同的查询,但是使用MySQL,因为我这一刻没有SQL Server访问权限,并且SQLFiddle的SQL Server选项正在运行。您可以很容易地将其调整为SQL Server。
http://sqlfiddle.com/#!9/36d576/26
表格强>
create table test(
eventid int,
eventdate datetime,
eventtype varchar(20),
userid int
);
insert into test values
(1 ,'2015-11-05 13:54:28.900', 'Login', 10),
(2 ,'2015-11-05 13:55:27.527', 'Lock' , 10),
(3 ,'2015-11-05 13:55:27.537', 'Break' , 10),
(4 ,'2015-11-05 13:55:37.037', 'Unlock' , 10),
(5 ,'2015-11-05 14:33:26.347', 'Login' , 10),
(6 ,'2015-11-05 14:33:46.243', 'Break' , 10),
(7 ,'2015-11-05 14:34:34.570', 'TaskPause' , 10);
<强>查询强>
select * from (
-- get first Login record before unlock
select t.userid, time_to_sec(timediff(u.eventdate, t.eventdate)) as sec
from test t
inner join (
-- get record for unlock
select eventid, userid, eventdate from test
where eventtype = 'Unlock' and userid = 10
) u on t.userid=u.userid
where
t.eventtype = 'Lock'
and t.eventid < u.eventid
and t.userid = 10
order by t.eventid asc
limit 1
) a
union all
select * from (
-- get lastest Login record before taskpause
select t.userid, time_to_sec(timediff(u.eventdate, t.eventdate)) as sec
from test t
inner join (
-- get record for taskpause
select eventid, userid, eventdate from test
where eventtype = 'TaskPause' and userid = 10
) u on t.userid=u.userid
where
t.eventtype = 'Login'
and t.eventid < u.eventid
and t.userid = 10
order by t.eventid desc
limit 1
) b
<强>结果强>
| userid | sec |
|--------|-----|
| 10 | 9 |
| 10 | 69 |
在SQL Server中,您可以使用datediff(second, time1, time2)
获取两次之间的秒数。一旦你得到你想要的结果,大多数其他的东西都可以优化。