2010-12-12 14 views
0

Ich ziehe Daten aus einem XML-Feed über C# -Code. Wenn ich die Daten zu bekommen, gibt es eine Datetime in folgendem Format:DateTime Verhalten in SQL Server & C#

<a:updated>2010-11-05T20:21:43.8303793Z</a:updated> 

ich gelesen, dass in Variable vom Typ Datetime. Ich habe dann (mit EF) diese Daten in eine Tabelle in meiner DB zu legen.

Später, wenn mein Code zurückläuft, um den Feed erneut herunterzuladen, überprüfe ich, ob der Wert in dem UPDATED-Feld, der in meiner Datenbank gespeichert ist, derselbe ist, der im XML-Feed zurückgegeben wird.

Ich Auswertung:

if (currentApp.Updated < app.Updated) 

wo currentApp.Updated ist das, was in meinem DB ist und app.Updated ist, was aus der letzten XML-Feed herunterladen gelesen wurde. Laufen sie jetzt nur, beide (im Debug-Fenster) zeigen:

{12/11/2010 8:13:44 PM} 

aber die IF-Anweisung ist die Bewertung als TRUE. Suchen Sie tiefer in die Objekte enthüllt: So

currentApp.Updated.Ticks = 634276952242500000 

app.Updated.Ticks = 634276952242511865 

wenn an die DB zu speichern, so scheint es, dass entweder C#, EF oder SQL Server die letzten 5 Ziffern Dumping (11865) und Setzen sie auf 0 s (00000).

Farbe mich frustriert. Irgendwelche Ideen, wie man dieses Problem löst? Mein Ideal ist, dass diese IF-Anweisung false ausgibt, da die UPDATED-Zeiten gleich sind.

Antwort

3

Nach dem Buch "Microsoft SQL Server 2005 T-SQL-Programmierung", wird SQL Server den Wert auf die nächste 1/300 Sekunde Aufrundung.

Also, ich glaube, Sie sollten

if (currentApp.Updated - app.Updated < TimeSpan.FromMilliseconds(-3.34)) 
+1

+1. Ich würde in meiner Antwort die Rundung erwähnen und wünschte mir, ich hätte es getan! ;) –

+0

Wenn Sie mehr Genauigkeit in SQL Server benötigen und ein Upgrade auf SQL Server 2008 oder neuer durchführen können, können Sie DATETIME2 verwenden, das eine Genauigkeit von 100ns aufweist (dasselbe wie der .NET DateTime-Typ). –

3
TimeSpan tsUpdated = app.Updated - currentApp.Updated; 

    if(tsUpdated.TotalMinutes > 1) 
    // Your current set of statements 
+1

Zeitspanne mit Sekunden, um Ihre if-Anweisung ändern und Millisekunden Vergleich scheint eine gute Art und Weise zu lösen ... –

0

.net bietet eine SqlDateTime Struktur, die verschiedenen Methoden, die von SQL Server und .net verwendet zu reflektieren Zeiten zu speichern. Aus der Dokumentation für SqlDateTime:

"Repräsentiert Datum und Uhrzeit Daten im Wert vom 1. Januar 1753 bis 31. Dezember 9999 mit einer Genauigkeit von 3,33 Millisekunden in einer Datenbank gespeichert oder abgerufen werden. Die SqlDateTime-Struktur hat eine andere zugrunde liegende Datenstruktur des entsprechenden .NET Framework-Typs DateTime, die jederzeit zwischen 12:00:00 AM 1/1/0001 und 11:59:59 PM 31.12.9999 dargestellt werden kann, mit einer Genauigkeit von 100 Nanosekunden. SqlDateTime speichert die relative Differenz tatsächlich auf 00:00:00 AM 1/1/1900. Daher wird eine Konvertierung von "00:00:00 AM 1/1/1900" zu einer Ganzzahl 0 zurückgeben. "

Dies stimmt mit Ihrer Beobachtung überein, dass die Zeit, die Sie von SQL zurück erhalten, genau auf Millisekunden genau ist.

Ich würde vorschlagen, beide Zeiten in SqlDateTime vor dem Vergleich zu konvertieren.

 DateTime currentApp = new DateTime(634276952242500000); 
    DateTime app = new DateTime(634276952242511865); 

    SqlDateTime currentAppSql = currentApp; 
    SqlDateTime appSql = app; 

    if (currentAppSql < appSql) { 
    } 
Verwandte Themen