状态总时间

时间:2017-06-20 09:42:48

标签: sql sql-server

我有一张桌子

dbo.tblHistory

Id | Status | TimeStamp
-----------------------
1  | ERR    | 2017-06-20 12:00:00.000
1  | ERR    | 2017-06-20 12:15:00.000
2  | OK     | 2017-06-20 12:20:00.000
1  | ERR    | 2017-06-20 12:30:00.000

如果现在的时间是12:45。我想为Id = 1返回45分钟。即它处于错误状态45分钟。

问题是我可能有这样的表:

Id | Status | TimeStamp
-----------------------
1  | ERR    | 2017-06-20 12:00:00.000
1  | OK     | 2017-06-20 12:15:00.000
1  | ERR    | 2017-06-20 12:30:00.000
2  | OK     | 2017-06-20 12:20:00.000

在这种情况下,如果它仍然是12:45,它只会出错15分钟。

是否可以在没有游标的情况下在SQL中执行此操作?

3 个答案:

答案 0 :(得分:1)

所以你的问题可以解决如下:

1.找到最后一条OK信息

2.从中查找下一条错误消息,然后获取自那时起的时间

select 
    DATEDIFF(mi,Min(TimeStamp),GETDATE()) as timeSinceInError 
from dbo.tblHistory 
where Id > ( select MAX(Id) from dbo.tblHistory where Status = N'OK')

答案 1 :(得分:0)

您可以使用子查询获取status='ERR'的最新时间戳,然后使用当前时间进行日期差异。

SELECT DATEDIFF(MINUTE,X.TimeStamp,GETDATE())
FROM( SELECT Id,Status,TimeStamp,ROW_NUMBER() OVER (PARTITION BY Status ORDER BY TimeStamp DESC) RN
      FROM dbo.tblHistory
      WHERE Status='ERR' ) X
WHERE X.RN=1

答案 2 :(得分:-1)

是的,这是可能的。

您需要获取最后一个错误时间戳并计算到现在的差异。

SELECT DATEDIFF(MINUTE, MAX(TimeStamp), GETDATE ())
FROM dbo.tblHistory 
WHERE Status = "ERR"