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

时间:2015-12-06 17:22:13

标签: sql sql-server sql-server-2008

我想计算用户的休息时间例如(休息时间=锁定 - 解锁时间)或 (休息时间=登录 - 任务暂停)

有人可以告诉我如何计算吗?

在下面的示例中,每当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

1 个答案:

答案 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)获取两次之间的秒数。一旦你得到你想要的结果,大多数其他的东西都可以优化。