根据某些条件减去日期时间项

时间:2019-03-07 19:51:32

标签: sql sql-server

我正在学习使用SQL Server 2016 Express的SQL。我正在构建一个应用程序,并使用数据库来监视用户活动。对于每个按钮,单击“ activity_type”和“ CURRENT_TIMESTAMP”记录日期时间。

SELECT activity_type, occurred_at 
FROM user_activity

这将返回以下示例数据

activity_type         occurred_at       
 ------------------- ---------------------- 
LogIn                3/7/2019 9:27:58 AM   
Action1              3/7/2019 9:27:59 AM   
Action2              3/7/2019 9:28:00 AM   
LogOut               3/7/2019 9:28:01 AM   
LogIn                3/7/2019 9:28:02 AM   
LogIn                3/7/2019 9:28:04 AM   

我想计算每次登录和注销之间活动的总时间。可能根本不需要注销活动。我可以将任何登录之前的上一次活动视为退出时间。

我期望的答案是第一次登录和Action2之间的时间,第二次和第三次登录之间的时间为0,并且两者之间没有活动。

关于如何解决此问题的任何想法?谢谢!

最新答案:

@Gordon提供的答案奏效了

结果是:

        Column1               Column2         dur_seconds  
 --------------------- --------------------- ------------- 
  03/07/2019 09:27:58   03/07/2019 09:28:00             2  
  03/07/2019 09:28:06   03/07/2019 09:28:06             0  
  03/07/2019 09:28:08   03/07/2019 09:28:08             0  
  03/07/2019 10:28:12   03/07/2019 10:28:12             0  
  03/07/2019 10:38:55   03/07/2019 10:38:55             0  
  03/07/2019 10:40:09   03/07/2019 10:40:09             0  
  03/07/2019 10:40:46   03/07/2019 10:40:46             0  
  03/07/2019 10:42:23   03/07/2019 10:49:28           425  
  03/07/2019 10:51:15   03/07/2019 10:57:49           394  
  03/07/2019 10:57:55   03/07/2019 10:59:02            67  

1 个答案:

答案 0 :(得分:0)

这很棘手。您想使用group by,但没有分组列。因此,您可以创建一个-通过计算每个记录的登录记录数。

然后:

select min(occurred_at), max(occurred_at),
       datediff(second, min(occurred_at), max(occurred_at)) as dur_seconds
from (select t.*,
             sum(case when activity_type = 'LogIn' then 1 else 0 end) over (order by occurred_at) as grp
      from t
     ) t
where activity_type <> 'LogOut'
group by grp;