2015-10-06 172 views
1

我們有運行,我們記錄每一步(SQL Server 2012中)SQL:檢測時,重複日誌(每30秒)缺少

有時每30秒一個SQL作業,沒有任何理由,沒有任何「工作失敗「的信息,工作停止,甚至掛起(我們想要分析的行爲)。

我們希望實現的是查詢日誌表並檢測記錄何時丟失(不會每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** 

我希望我的問題是清楚的。

回答

1

這表明超過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 
+0

謝謝你的回答,我仍然試圖理解你的SQL語句,但是使用它仍然在4分鐘後執行....我粘貼了我現有的(骯髒的)解決方案,它在5秒內工作。 –

+0

你有CREATION_DATE的索引嗎? –

+0

我認爲這是問題,CREATION_DATE是一個沒有索引的簡單日期時間字段。 –

0

不再各個時期這是我的「髒」的解決方案,同時試圖讓路易斯的解決方案正常工作(看起來比我好)

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'. 

爲了過濾更長的時間

0

使用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秒。