5

アプリケーションから報告されたエラー ログを保持するデータベース テーブルがあります。

特定のエラーが発生した場合、アプリケーションは再びアクティブになる前に人間の介入を必要とします。

ログを並べ替えて、イベントのすべてのペアの間に発生した合計時間を特定する必要があります。

そのため、アプリが特定の時間に介入が必要な ERROR 状態になった場合、アプリが再起動された次のエラー ログまでの経過時間を見つける必要があります。

次に、イベントのすべてのペア間の合計経過時間の合計が必要です。

テーブルは次のようになります。

ErrorID |  ErrorMessage | ErrorDateTime
---------------------------------------------
 20     | ex. msg 1     | 2013-09-01 00:10:10 
 21     | ex. msg 2     | 2013-09-01 00:10:15   
 22     | ex. msg 3     | 2013-09-01 00:10:20 
 23     | ERROR         | 2013-09-01 00:10:25
 24     | ex. msg 4     | 2013-09-01 00:10:30 
 25     | ex. msg 5     | 2013-09-01 00:10:35       
 26     | ex. msg 6     | 2013-09-01 00:10:37   
 27     | App Restarted | 2013-09-01 00:11:30 
 28     | ex. msg 7     | 2013-09-01 00:11:35 
 29     | ex. msg 8     | 2013-09-01 00:11:40   
 30     | ex. msg 9     | 2013-09-01 00:11:43 
 31     | ERROR         | 2013-09-01 00:11:45
 32     | ex. msg 10    | 2013-09-01 00:12:10 
 33     | ex. msg 11    | 2013-09-01 00:12:20       
 34     | ex. msg 12     | 2013-09-01 00:12:22   
 35     | App Restarted | 2013-09-01 00:13:30        

したがって、基本的には、すべてのエラーのタイムスタンプと、その後のアプリの再起動ログ メッセージの違いを見つける必要があります。

次に、これらすべての期間の合計を取得します

誰かが私を正しい方向に向けることができますか?

4

3 に答える 3

1

次のクエリは、各エラーの再起動時間を取得します。

select l.*,
       (select top 1 ErrorDateTime
        from logs l2
        where l2.ErrorId > l.ErrorId and
              l2.ErrorMessage = 'App Restarted'
        order by l2.ErrorId
       ) as RestartTime
from logs l
where l.ErrorMessage = 'ERROR';

合計を取得するには、合計時間が必要です。秒単位の合計は次のとおりです。

with errors as (
    select l.*,
           (select top 1 ErrorDateTime
            from logs l2
            where l2.ErrorId > l.ErrorId and
                  l2.ErrorMessage = 'App Restarted'
            order by l2.ErrorId
           ) as RestartTime
    from logs l
    where l.ErrorMessage = 'ERROR'
   )
select sum(datediff(second, ErrorDateTime, RestartTime)) as SecondsDown
from errors;
于 2013-09-11T18:10:22.097 に答える
0

この方法も試すことができます...

;WITH x AS
(
  SELECT ErrorID, ErrorMessage, ErrorDateTime,
    rn = ROW_NUMBER() OVER (ORDER BY ErrorDateTime)
  FROM dbo.YourLogTable
  WHERE ErrorMessage IN ('ERROR', 'App Restarted')
)
SELECT
   TotalDowntime = SUM(DATEDIFF(SECOND, y.ErrorDateTime, x.ErrorDateTime))
FROM x
LEFT OUTER JOIN x AS y
ON x.rn = y.rn + 1
WHERE x.ErrorMessage = 'App Restarted';
于 2015-05-26T11:23:23.483 に答える