Vergleichen von gleichen Datumsangaben nicht vergleichen

8

Ich habe eine Abfrage, wie Datumsangaben in C # verglichen / gespeichert werden. Betrachten Sie den folgenden Code:

%Vor%

Assert.IsNotNull ist wegen der Datetime-Prüfung fehlgeschlagen. Ich würde erwarten, dass die LanguageDictionary-Instanz mit dem Wert der Variablen erstellt wird, dass die beiden gleich wären. Dies verwendet Telerik.OpenAccess und MSSQL als eine DB-Schicht, so nehme ich an, dass das Problem dort kommt. Kann mir jemand sagen, ob mir irgendetwas fehlt und wie man diese Werte richtig vergleicht.

BEARBEITEN: Die Tick-Werte sind unterschiedlich, aber ich weiß nicht warum, da beide von der gleichen Variablen kommen, die ich nur einmal zugewiesen habe.

    
Ash 17.04.2013, 08:44
quelle

3 Antworten

15

Versuchen Sie es mit DateTime.Equals(x.CreatedDate, createdDate) , es könnte helfen.

Ansonsten ist das richtige DateTime comparing ein sehr kompliziertes Thema mit Zeitzonen, Offsets, utc, Ortszeit und so weiter. Ich wäre überhaupt nicht überrascht bei einem einfachen == Vergleich zwischen zwei scheinbar identischen Daten, um false zurückzugeben.

Wenn sich der Wert Ticks beim Schreiben und Lesen unterscheidet, liegt möglicherweise ein Problem mit DateTimeKind vor, bei dem Sie ein DateTimeKind.Local in die Datenbank schreiben, aber ein DateTimeKind.Unspecified zurückerhalten.

Die andere Option könnte (wenn die Differenz klein genug ist) sein, dass das Feld DateTime in Ihrer Datenbank nicht signifikant genug ist, um die gleiche Anzahl an Millisekunden wie die .net DateTime :

zu speichern
  

Ein einzelner Tick entspricht hundert Nanosekunden oder einem Zehnmillionstel einer Sekunde. Es gibt 10.000 Ticks in einer Millisekunde.

Abhängig von Ihrem Datenspeicher ist er möglicherweise nicht so detailliert wie dieser. Ihre DateTime -Werte stammen nicht aus derselben Quelle, einer wird aus dem Speicher gelesen, der andere wird aus der Datenbank gelesen.

    
Willem Duncan 17.04.2013, 08:54
quelle
2

SqlServer speichert datetime in (ca.) 3-Millisekunden-Schritten.

  

datetime-Werte werden auf Inkremente von .000, .003 oder .007 Sekunden

gerundet

Ein Roundtrip einer DateTime durch die Datenbank könnte daher um einige ms abweichen.

Sie sollten also nicht nach "genau gleich" suchen, sondern nach "nahe genug"

%Vor%     
Hans Kesting 17.04.2013 09:20
quelle
0

Ich denke, es wäre besser für Sie, DateTime.UtcNow zu verwenden, wenn Sie die Daten speichern und dann müssen Sie sich keine Gedanken über Zeitumstellungsprobleme machen. Sie können es dann später in der Kultur anzeigen, wie Sie es wollen wählen.

    
Michael Ciba 17.04.2013 08:53
quelle