如何根据某个字段计算SQL中同一列中两个日期之间的持续时间
我想计算用户的中断持续时间,例如(中断持续时间=锁定解锁时间)或 (中断持续时间=登录任务暂停) 有人能告诉我怎么计算吗 在下面的示例中,每当EventType中出现中断时,计算上一行日期下一行日期。如何实现这一点 下面是我的桌子如何根据某个字段计算SQL中同一列中两个日期之间的持续时间,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我想计算用户的中断持续时间,例如(中断持续时间=锁定解锁时间)或 (中断持续时间=登录任务暂停) 有人能告诉我怎么计算吗 在下面的示例中,每当EventType中出现中断时,计算上一行日期下一行日期。如何实现这一点 下面是我的桌子 EventId EventDate EventType Userid 1 2015-11-05 13:54:28.900 Login 10 2 2015-11-05 13:55:27.527 Lock
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
我创建了一个有点相同的查询,但是使用MySQL,因为我现在没有SQL Server访问权限,而SQLFiddle的SQL Server选项出现了问题。您可以很容易地将其应用于SQL Server 表格
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
在SQL Server中,您可以使用
datediff(second,time1,time2)
获取两次之间的秒数。一旦你得到想要的结果,大多数其他东西都可以优化。编辑你的问题并提供想要的结果。想要的输出将是Userid和Break DurationColumn@Rajashri我的回答对你有帮助吗?如果是的话,请你把你的问题标记为“接受”来结束?谢谢。@zedfoxus-我在中断事件类型中有多个场景,每次我都必须创建不同的select语句和union,我认为这不是一个好方法。我要看的是,每当发生中断事件类型时,减去上一个事件日期和下一个事件日期。我们可以缩短此查询吗?
| userid | sec |
|--------|-----|
| 10 | 9 |
| 10 | 69 |