J'ai une table de database qui contient des journaux d'erreurs signalés à partir d'une application.
Si certaines erreurs se produisent, l'application nécessite une intervention humaine avant de redevenir active.
J'ai besoin de sortinger les journaux et de déterminer le time total qui s'est accumulé entre chaque paire d'events.
Ainsi, lorsque l'application passe en état ERROR où une intervention est requirejse à un certain moment, j'ai besoin de find le time écoulé jusqu'au prochain journal des erreurs où l'application a été redémarrée.
Ensuite, j'ai besoin de la sum du time écoulé total entre chaque paire d'events.
La table ressemble à ceci:
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
Donc, fondamentalement, j'ai besoin de find la différence entre les horodateurs de chaque ERREUR et le message de journal App redémarré.
Ensuite, obtenez la sum de toutes ces durées
Est-ce que quelqu'un peut-il me montrer la bonne direction?
;WITH x AS ( SELECT ErrorID, ErrorMessage, ErrorDateTime, rn = ROW_NUMBER() OVER (ORDER BY ErrorDateTime, ErrorID) FROM dbo.YourLogTable WHERE ErrorMessage IN ('ERROR', 'App Restarted') ) SELECT y.ErrorID, x.ErrorID, [Back_Up] = y.ErrorDateTime, SecondsDown = 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';
Cela vous donne chaque durée d'indisponibilité. Je ne suis pas sûr de la valeur de la SUM
– sur la durée de vie de l'application? Limité à un certain laps de time? Autre chose? Mais vous pouvez l'get de cette façon:
;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';
La requête suivante obtient le time de redémarrage pour chaque erreur:
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';
Pour get la sum, il faut des time de sommation. Voici la sum en secondes:
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;
Vous pouvez essayer de cette façon aussi …
;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';