我有一张桌子
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中执行此操作?
答案 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"