2016-05-13 6 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()を返すように見えます。

@Gordon Linoffの答えによれば、DATEDIFFの第2引数にはMAX(TimeCreated)があり、これはdiffの開始時刻です。あなたはまた、おそらくそれは、比較を実行する前に、ローカル時刻に変換されますことを110%を確認するために%EXTERNAL機能でそれをラップしたい:

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

我々が比較しているとして上記のクエリは私に私が期待する結果が得られます正しい順序で同じ時間帯に2回!

すべては、変換前の値をとるかどうかについては、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

更新を参照してください。私は薬を飲んでいますか? –

関連する問題