如何根据某个字段计算SQL中同一列中两个日期之间的持续时间

如何根据某个字段计算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

我想计算用户的中断持续时间,例如(中断持续时间=锁定解锁时间)或 (中断持续时间=登录任务暂停)

有人能告诉我怎么计算吗

在下面的示例中,每当EventType中出现中断时,计算上一行日期下一行日期。如何实现这一点

下面是我的桌子

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 |