SQL: обнаружение отсутствия повторяющегося журнала (каждые 30 секунд)
У нас есть задание SQL, которое выполняется каждые 30 секунд, где мы регистрируем каждый шаг (SQL Server 2012)
Иногда, без какой-либо причины и без какого-либо сообщения "сбой задания", задание останавливается и даже зависает (поведение, которое мы хотели бы проанализировать).
Чего мы хотели бы добиться - это запросить таблицу журналов и определить, когда запись отсутствует (не происходит каждые 30 секунд).
Например:
CREATION_DATE MESSAGE
2015-09-17 07:49:38.053 11 : **Fin**
2015-09-17 07:49:02.377 11 : **Fin**
2015-09-17 07:48:32.100 11 : **Fin**
2015-09-17 07:48:01.940 11 : **Fin**
2015-09-17 07:47:32.100 11 : **Fin**
2015-09-17 07:47:01.967 11 : **Fin**
2015-09-17 07:46:31.663 11 : **Fin**
2015-09-17 07:46:01.803 11 : **Fin**
2015-09-17 07:45:31.663 11 : **Fin**
2015-09-17 07:45:02.060 11 : **Fin**
2015-09-17 07:44:31.843 11 : **Fin**
2015-09-17 07:44:01.970 11 : **Fin**
2015-09-17 07:43:22.397 11 : **Fin** <= MUST BE DETECTED (23 minutes between events)
2015-09-17 07:20:01.767 11 : **Fin** <= MUST BE DETECTED (3 minutes between events)
2015-09-17 07:17:01.743 11 : **Fin**
2015-09-17 07:16:31.777 11 : **Fin**
2015-09-17 07:16:01.690 11 : **Fin**
2015-09-17 07:15:31.733 11 : **Fin**
2015-09-17 07:15:01.807 11 : **Fin**
2015-09-17 07:14:31.683 11 : **Fin**
2015-09-17 07:14:01.793 11 : **Fin**
2015-09-17 07:13:31.853 11 : **Fin**
2015-09-17 07:13:01.840 11 : **Fin**
Я надеюсь, что мой вопрос ясен.
3 ответа
Это показывает все периоды больше 30 секунд
select A.CREATION_DATE as Start, min(N.CREATION_DATE) as Finish
from logTable A
left join logTable N on A.CREATION_DATE < N.CREATION_DATE
group by A.CREATION_DATE
having datediff(second, A.CREATION_DATE, min(N.CREATION_DATE)) > 30
Использование CTE делает это довольно легко.
with ordered_logs (creation_date, rnk) as
(
select creation_date, row_number() over (order by creation_date)
from your_log_table
)
select first.creation_date, second.creation_date, datediff(ss, first.creation_date, second.creation_date) as SecondsDifference
from ordered_logs first
inner join ordered_logs second on (first.rnk + 1) = second.rnk
where datediff(ss, first.creation_date, second.creation_date) > 30
Это упорядочивает все записи по дате их создания, а затем объединяет более раннюю запись со следующей (по времени). Затем он просто проверяет, превышает ли время создания более 30 секунд.
Это моё "грязное" решение, когда я пытаюсь заставить работать решение Луиса (выглядит лучше моего)
SELECT TOP 1000 [PROCEDURE_NAME]
,[CREATION_DATE]
,[MESSAGE]
,
DATEDIFF(SECOND,
(SELECT top 1 [CREATION_DATE]
FROM [mactac].[mactac].[ERROR_LOG] f
WHERE f.[CREATION_DATE]<c.[CREATION_DATE]
AND [PROCEDURE_NAME] like '%downl%'
AND [MESSAGE] LIKE '11 : **Fin**'
order by [CREATION_DATE] desc)
,c.[CREATION_DATE]) as DIFF
FROM [mactac].[mactac].[ERROR_LOG] as c
WHERE [PROCEDURE_NAME] like '%downl%'
AND [MESSAGE] LIKE '11 : **Fin**'
order by [CREATION_DATE] desc
Это решение отображает все записи и прошедшее время:-D Но.... Я еще не понял, как добавить:
И DIFF > 35
Invalid column name 'DIFF'.
Для того, чтобы отфильтровать более длительное время