2016-05-13 29 views
2

我認爲這很簡單,但是我有一個問題。正在檢索自上次記錄以來的秒數

SELECT DATEDIFF (s,getdate(), max(TimeCreated)) as difference 
FROM Ens.MessageHeader 

我的期望是,這將顯示當前時間和最近記錄的時間戳之間的差異。如果我執行它,我會得到類似於15057這可能是正確的。但是,下次執行它時,它會更低。沒有任何新記錄。現在它在15024。仍然沒有新的記錄。最近的時間戳是2016-05-13 08:51:16

這個想法是,我可以看這個計數器,當它重置爲零,我知道有一個新的消息。

我錯過了什麼?

更新我增加了一些額外的數據查詢幫忙看看是怎麼回事:

SELECT getDate() as now, max(TimeCreated) as latest, DATEDIFF (s,getdate(), max(TimeCreated)) as difference 
FROM Ens.MessageHeader 

這裏有兩個結果集:

now     latest    difference 
------------------- ------------------- ---------- 
2016-05-13 09:50:45 2016-05-13 08:51:16 14431  
2016-05-13 09:52:29 2016-05-13 08:51:16 14327  
2016-05-13 09:52:50 2016-05-13 08:51:16 14306  
+0

當我在自己的具有日期值的表上執行相同的代碼時,我得到一個負數的秒數。 – GendoIkari

回答

4

這裏的問題與您撥打DATEDIFF()時的參數順序有關,而TimeCreated是UTC時間戳,在某些情況下會轉換爲本地時間,但看起來好像沒有在轉換時發生在DATEDIFF之內。所以你的查詢看起來像是返回MAX(TimeCreated + UTC_offset) - getdate(),這是一個正變小的正數。

As @Gordon Linoff的回答指出,您應該有MAX(TimeCreated)作爲DATEDIFF的第二個參數,因爲這是差異的開始時間。你也可能想包裝,在%EXTERNAL功能,使110%肯定它是被轉換爲本地時間運行在比較前:

SELECT DATEDIFF(second, %EXTERNAL(MAX(TimeCreated)), getdate()) 
FROM Ens.MessageHeader 

上述查詢給我的結果,我期望,因爲我們是在比較兩次在正確的順序和在同一時區!

說了這麼多,我不確定DATEDIFF()有關進行轉換前值的行爲是有意的還是一個錯誤。

+0

'%EXTERNAL()'做了詭計,謝謝! –

0

這是好奇。發生了什麼事是TimeCreated是在「未來」。 DATEDIFF(x, <exp1>, <exp2>)計算差異<exp2> - <exp1>

所以,如果TimeCreate應該是在過去,那麼你可以嘗試:

SELECT DATEDIFF(second, max(TimeCreated), getdate()) 
FROM Ens.MessageHeader; 

你會然後得到一個負數,不知道發生了什麼。隨着越來越多的秒數過去,負數趨向於零,因爲當前日期/時間正在接近max(TimeCreated)

我的猜測是你有一個時區問題。或者,你有一些影響TimeCreated的偏見。您可能想要review other ways獲取當前日期/時間值。

+0

查看更新。我在吸毒嗎? –

相關問題