SQL计算包含特定值的两行之间的时间差

时间:2017-04-12 14:19:15

标签: sql sql-server

我有一个表格,其中包含移动设备上用户工作状态的信息。每次状态更改时,都会创建一个新行,其中包含更改前的原始状态以及现在的新状态。该表如下所示:

ID      Date_Time              User      OriginalStatus     NewStatus    
---------------------------------------------------------------------------
60713   2017-04-11 12:14:42    Helen     Not Started        Active
60714   2017-04-11 12:19:20    Monica    Active             Paused
60715   2017-04-11 12:20:43    Dave      Active             Paused
60716   2017-04-11 12:32:18    Helen     Finished           Archived
60717   2017-04-11 12:48:57    Monica    Paused             Active
60718   2017-04-11 12:52:35    Dave      Paused             Active

我要做的是计算每个用户在每个日期保持“暂停”状态的持续时间......他们只能从“已暂停”状态恢复为“有效状态”,这表示他们的结束'暂停'时间,所有其他行都可以忽略,从'已暂停'回到'有效'的更改不会在连续的行中。

在上面的例子中,Monica保持“暂停”29分37秒(12:19:20至12:48:57),Dave已经'暂停'31分52秒(12:20) :43到12:52:35)。

理想情况下,我希望结果类似于:

User      Paused_Start_Time      Paused_End_Time        Paused_Duration
---------------------------------------------------------------------------
Monica    2017-04-11 12:19:20    2017-04-11 12:48:57    00:29:37
Dave      2017-04-11 12:20:43    2017-04-11 12:52:35    00:31:52

我对如何解决这个问题感到茫然,所以所有的帮助都感激不尽。我正在使用SQL Server 2012。

1 个答案:

答案 0 :(得分:1)

我认为你只需要filterNot

lead()

要获得持续时间,您可以减去这些值。但是,这会将间隔作为 datetime 值返回。您可以将其转换为select user, date_time as paused_starttime, next_date_time as paused_endtime from (select t.*, lead(date_time) over (partition by user order by date_time) as next_date_time from t ) t where status = 'paused'; ,但时间永远不会超过24小时。当时间超过那个时期时,我不确定你想做什么。