开发者社区> 问答> 正文

当In和Out时间在同一列中时计算时差

这是我的示例数据:

ID          StartTime                       IPStatus   
A           2019-12-23 11:28:24.190             1   
B           2019-12-23 11:28:24.190             1 
B           2019-12-23 11:28:35.593             1 
A           2019-12-23 11:28:35.593             1 
A           2019-12-23 11:28:51.830             1 
B           2019-12-23 11:28:51.830             1 
B           2019-12-23 11:29:03.140             0 
A           2019-12-23 11:29:03.140             0 
A           2019-12-23 11:30:03.140             0 
B           2019-12-23 11:30:03.140             0 
B           2019-12-23 11:35:03.140             0 
A           2019-12-23 11:35:03.140             0 
A           2019-12-23 11:40:03.140             1 
B           2019-12-23 11:40:03.140             1 
B           2019-12-24 11:40:03.140             1 
A           2019-12-24 11:40:03.140             1 
A           2019-12-25 11:40:03.140             0 
B           2019-12-25 11:40:03.140             0 
B           2020-01-25 11:40:03.140             0 
A           2020-01-25 11:40:03.140             0 
A           2021-01-25 11:40:03.140             1 
B           2021-01-25 11:40:03.140             1

我需要以Days:Hours:Min:Seconds格式计算ID A和B输入和输出多少时间。Ipstatus 1表示IN,0表示out。

我有这段代码可以计算出Days:Hours:Min:Seconds中的时差

Declare @start datetime = '2019-06-26 12:14:13',@End datetime = '2019-08-27 12:14:36'

select convert(varchar(550),DateDiff(day, @start, @End)%3600)+'D : '+convert(varchar(5),DateDiff(s, @start, @End)/3600/60)+'H : '+convert(varchar(5),DateDiff(s, @start, @End)%3600/60)+'M : '+convert(varchar(5),(DateDiff(s, @start, @End)%60)) +'S' as Duration 但是当我们有2个单独的列时,它可以工作。在上述情况下如何计算时差?请建议

预期产量:

ID         Status      TotalTime
 A          1           10D : 10Hr : 15 min : 15 sec    
 A          0           10D : 10Hr : 15 min : 15 sec  
 B          1           10D : 10Hr : 15 min : 15 sec    
 B          0           10D : 10Hr : 15 min : 15 sec

注意:我刚刚输入了随机总数。

第一个启动时间2019-12-23 11:28:24.190第 一个启动时间2019-12-23 11:28:35.593 第三个启动时间2019-12-23 11:28:51.830

Ipstatus = 1时为11 + 16 = 16秒,依此类推

展开
收起
祖安文状元 2020-01-05 14:11:18 468 0
1 条回答
写回答
取消 提交回答
  • SELECT ID,IPStatus,
        CONVERT(VARCHAR(100),SUM(DATEDIFF(DAY, [StartTime], EndTime)%3600))+ ' D :'
        +CONVERT(VARCHAR(100),SUM(DATEDIFF(s, [StartTime], EndTime)/3600/60))+ 'H: '
        +CONVERT(VARCHAR(100),SUM(DATEDIFF(s, [StartTime],     EndTime)%3600/60))+ 'M: '
        +CONVERT(VARCHAR(100),SUM(DATEDIFF(s, [StartTime], EndTime)%60))+ 'S'
    FROM 
    (
        SELECT ID,[IPStatus],[StartTime],LEAD([StartTime]) over (PARTITION BY ID,[IPStatus] ORDER BY [StartTime]) AS EndTime
        FROM Table1
    )T
    WHERE StartTime<>EndTime
        AND EndTime IS NOT NULL
    GROUP BY ID,IPStatus
    
    2020-01-05 14:11:30
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载