2016-05-13 15 views
2

Ich dachte, das wäre einfach, aber ich habe ein Problem.Abrufen von Sekunden seit dem letzten Datensatz

Meine Erwartung war, dass dies den Unterschied zwischen der aktuellen Uhrzeit und dem Zeitstempel des letzten Datensatzes zeigen würde. Wenn ich es ausführe, bekomme ich etwas wie 15057, das möglicherweise richtig sein könnte. Jedoch, wenn ich es das nächste Mal ausführe, ist es niedriger. Es gab keine neuen Aufzeichnungen. Jetzt ist es bei 15024. Noch keine neuen Rekorde. Der aktuellste Zeitstempel ist derzeit 2016-05-13 08:51:16

Die Idee ist, dass ich diesen Zähler beobachten kann und wenn es auf Null zurücksetzt, weiß ich, dass es eine neue Nachricht gibt.

Was fehlt mir?

aktualisieren Ich habe einige zusätzliche Daten, um die Abfrage zu helfen, zu sehen, was los ist:

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

Hier sind ein paar Ergebnismengen:

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

Wenn ich denselben Code auf meiner eigenen Tabelle ausführen, die einen Datumswert hat, bekomme ich eine negative Anzahl von Sekunden zurück. – GendoIkari

Antwort

4

Die Gotcha hier haben mit der Reihenfolge der Argumente in Ihrem Anruf DATEDIFF() und die Tatsache zu tun, dass TimeCreated ein UTC-Zeitstempel ist, der in der lokalen Zeit in einigen Situationen umgewandelt wird, aber es sieht aus wie es nicht umgesetzt wird, wenn innerhalb DATEDIFF. Ihre Anfrage sieht so aus, als würde sie MAX(TimeCreated + UTC_offset) - getdate() zurückgeben, was eine positive Zahl ist, die kleiner wird.

Wie @Gordon Linoffs Antwort sagt, sollten Sie MAX(TimeCreated) als zweites Argument zu DATEDIFF haben, da das die Startzeit für das diff ist. Sie wollen auch wahrscheinlich, dass in der %EXTERNAL Funktion wickeln 110% sicher zu stellen, dass es vor dem Ausführen des Vergleichs die lokale Zeit konvertiert ist wird:

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

Die obige Abfrage gibt mir die Ergebnisse, die ich erwarten würde, wie wir vergleichen Die zwei Mal in der richtigen Reihenfolge und in der gleichen Zeitzone!

Alles, was gesagt, ich bin mir nicht sicher, ob das DATEDIFF() Verhalten über die Vorkonvertierung Wert ist beabsichtigt oder ein Fehler.

+0

'% EXTERNAL()' hat den Trick gemacht, danke! –

0

Dies ist neugierig. Was passiert ist, dass die TimeCreated in der "Zukunft" ist. DATEDIFF(x, <exp1>, <exp2>) berechnet den Unterschied von <exp2> - <exp1>.

Also, wenn TimeCreate soll in der Vergangenheit sein, dann können Sie versuchen:

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

Sie werden dann eine negative Zahl bekommen und sich fragen, was geschieht. Wenn mehr Sekunden vergehen, geht die negative Zahl in Richtung Null, weil das aktuelle Datum/die aktuelle Zeit näher an max(TimeCreated) kommt.

Meine Vermutung ist, dass Sie ein Zeitzonenproblem haben. Oder Sie haben eine Voreingenommenheit, die TimeCreated beeinflusst. Möglicherweise möchten Sie review other ways, um den aktuellen Datums-/Uhrzeitwert abzurufen.

+0

Siehe Aktualisierung. Bin ich auf Drogen? –