2014-10-28 55 views
0

我有一個腳本,每30分鐘運行一次查詢,查詢前30分鐘內的新記錄。爲了說明腳本運行的任何類型的延遲,我想看看前面的0:00-30:00分鐘和30:01-59:59大塊。查詢0-30分鐘羣組中的數據

例如,如果我的腳本在上午11點運行,我希望它發現有一個

entered_date > 10:30 am AND < 11:00 am

而當它運行在上午11:30,我期望新行從'entered_date> 11:00 am和< 11:30 am新行。

做這樣的事情只得到最後的跑步30分鐘:此

SELECT 
    fa.entered_date, 
    fa.text 
FROM 
    form_answers fa 
WHERE 
    AND fa.value = 1 
    AND fa.entered_date >= DATEADD(mi, -30, GETDATE()) 

所以,如果我的劇本在某種程度上由幾秒鐘的延遲,並且在11:00:02跑了,我可能會錯過一個記錄有一個entered_date的10:30:01。

編輯:

這是結束了,我的工作:

fa.entered_date BETWEEN 
     DATEADD(mi,-30,CONVERT(VARCHAR(19),DATEADD(mi, DATEDIFF(mi, 0, GETDATE())/30*30, 0))) 
    AND 
     DATEADD(mi, DATEDIFF(mi, 0, GETDATE())/30*30, 0) 

回答

0

即使您追蹤「最後」處理時間,可能有錯過的記錄或兩次處理過的記錄,但沒有確切的方法可以僅基於時間來處理「新」記錄。

一些替代方法:

  • 跟蹤所處理的最後一個entered_date和過程,是在該時間之後加入任何東西。
  • 跟蹤處理的最後一個ID,並處理具有較高ID的任何記錄(假設您的表使用遞增鍵)。
  • 添加標誌或狀態字段到您的記錄,以確定它們是否已被處理
  • 使用添加記錄(使用觸發器)並定期處理時填充的隊列。

如果DO有單獨依靠時鐘,那麼我會圓「當前」時間到最近的30分鐘間隔,並鎖定回從 30分鐘。因此,如果當前時間爲11:00:02,則會將其舍入到11:00:00,並處理在10:30:0011:00:00之間添加的記錄。

+0

我同意你和Gordon關於不同跟蹤方法的建議。但是,我無法將數據插入到此特定數據庫中,只能查詢數據。它只是讓我使用時鐘方法。你能提供一個將「當前」時間四捨五入到最近的例子,然後回顧30分鐘的時間嗎? – etm124 2014-10-28 18:08:17

+0

隨着你的建議,我認爲這樣的事情可以工作:http://pastebin.com/SBeZTwKw – etm124 2014-10-28 18:19:10

3

這是一個評論太長。

根據腳本中的時鐘時間是個壞主意。您的腳本可能因其他原因而無法運行 - 例如,SQL Server代理程序未運行,或者服務器在運行時重新啓動,或者新用戶意外取消選中某個框。或者,它可能會在一段時間內運行兩次。

如果你想要健壯性,那麼保留上次腳本運行的日誌表。再從日誌中讀取,這樣的:

select @lastlogtime = max(lastreadtime) 
from log; 

而在你的查詢,而不是依靠時鐘使用。

+0

我100%同意使用時鐘是一個可怕的想法。我寧願跟蹤腳本何時運行,但是,我無法將數據插入到特定數據庫中。只是查詢。 – etm124 2014-10-28 17:51:42

+0

@ etm124。 。 。也許你應該爲這樣的表獲得自己的數據庫,在這種情況下(它可以是一個不同的數據庫)。這似乎是一個奇怪的結構,您可以運行一個作業,但沒有在服務器上的任何地方寫入權限。作爲最後的手段,您可以將這些信息保存在一個文件中,但在運行數據庫作業時這是不正確的。 – 2014-10-28 17:52:42