2009-06-20 3 views

Antwort

6

Sie können die DateTime.CompareTo Methode verwenden.

Verwendung ist wie folgt:

firstDateTime.CompareTo(secondDatetime); 

und gibt einen int als Ergebnis die

Weniger als Null zeigt an - Diese Instanz ist früher als Wert.

Null - Diese Instanz entspricht dem Wert.

Größer als Null - Diese Instanz ist später als der Wert.

+0

bitte schreiben Erwähnungen –

+0

Am Ende dieser Seite finden Sie ein konkretes Beispiel in C#: http://msdn.microsoft.com/en-us/library/5ata5aya.aspx – merkuro

+0

Thans viel für Sie –

5

Unter der Annahme, dass Sie überprüfen möchten, dass die beiden Datetime gleichwertig sind es auf diese Weise:

TimeSpan span = dateTime2 - dateTime1; 
if (span == TimeSpan.Zero) 
{ 
    // The times are the same 
} 

Sie müssen die System.Data.SqlTypes.SqlDateTime-System.DateTime zunächst natürlich konvertieren, wie echosca in seiner answer weist darauf hin.

Obwohl es einige erlaubte Rundungsfehler geben sollte (im Millisekundenbereich), da diese wahrscheinlich reale abgeleitete Werte sind, da die einfache Gleichheit nicht gut genug wäre. Sie würden so etwas wie dies benötigen:

if (Math.Abs(span.TotalMilliseconds) < 10.0) 
{ 
    // The times are within the allowed range 
} 

Wenn Sie nur wollen, vergleichen, ob ein Termin vor oder eine andere nach dem Gebrauch die DateTime.CompareTo Methode wie andere vorgeschlagen haben.

+0

Das 'span.TotalDays == 0 && span.TotalHours == 0 && span.TotalMinutes == 0' Bit ist vollständig redundant, da TotalSeconds implizit die Minuten, Stunden usw. in Sekunden konvertiert. – Noldorin

+0

Bugger - das kommt, wenn man zu schnell tippt! Ich werde die Antwort aktualisieren – ChrisF

+0

@ChrisF: Ja, einfach genug Fehler zu machen. Wie auch immer, es ist gut, dass Sie darauf hingewiesen haben, dass Gleitkomma-Probleme beim Testen von DateTimes auftreten. (Üblicherweise müssen Sie jedoch nur < and > verwenden.) – Noldorin

7

Die Standardvergleichsoperatoren (z. B. Gleichheit, kleiner als, größer als) sind für den Typ DateTime überlastet. So können Sie einfach Tests durchführen, wie die folgenden:

var foo = DateTime.Parse("01/01/1900"); 
var bar = DateTime.Now; 

var test1 = foo == bar; // false 
var test2 = foo != bar; // true 
var test3 = foo < bar; // true 
var test4 = foo > bar; // false 
+0

+1. Ich verstehe nicht, warum manche Antworten das unnötig kompliziert machen. –

+0

Prost.Und ja, das ist definitiv der einfachste Weg, meiner Meinung nach zu gehen. (Gibt das gleiche Verhalten wie CompareTo, ist aber besser lesbar.) – Noldorin

1

Sie müssen den Wert von SQL in C# Datetime-Objekt gesetzt, und vergleichen sie dann in C#. Hier ist ein link von MSDN, wie es geht.

1

Wenn Sie aus der Datenbank abgerufen werden, sollten Sie in der Lage sein, einen SqlDataReader zu verwenden, um in den richtigen .NET-Typ zu konvertieren. (oder verwenden Sie DataTable/DataSet, was dies automatisch tut).

SqlDataReader dr = cmd.ExecuteReader(); 
DateTime dt = dr.GetDateTime(dr.GetOrdinal("someDateTimeColumn")); 

dann können Sie in der Regel vergleichen:

DateTime otherDate = DateTime.Now; 
int compResult = dt.CompareTo(otherDate); 

if(compResult > 0) { Console.Write("dt is after otherDate"); } 
else if(compResult < 0) { Console.Write("dt is before otherDate"); } 
else { Console.Write("dt is equal to otherDate"); } 
0

Datetime-Struktur überschreibt GreterThen, GreaterThenOrEqual, LesserThen, LesserThenOrEqual operater, Equalty operater.

DateTime dateTime1, dateTime2; 
dateTime1 = DateTime.Now; 
dateTime2 = //set value from database; 

// all this operations are legal 
if(dateTime1 == dateTime2){} 
if(dateTime1 > dateTime2){} 
if(dateTime1 < dateTime2){} 
1

System.Data.SqlTypes.SqlDateTime und System.DateTime verwenden unterschiedliche Grunde liegenden Strukturen Daten darzustellen.

SqlDateTime stellt den Bereich 1. Januar 1753 bis 31. Dezember 9999 mit einer Genauigkeit von 3,33 Millisekunden

Datumzeit (.NET Framework-Typ) stellt den Bereich zwischen 1. Januar 0001 bis 31. Dezember 9999 auf die Genauigkeit von 100 Nanosekunden

Sie sollten vorsichtig sein, diese Grenzen beim Vergleich von Daten. Eine Taktik zur Linderung von Problemen bei Vergleichen könnte darin bestehen, alles auf System.DateTime zu transformieren und dann den Vergleich durchzuführen.

Sie können die Value-Eigenschaft der SqlDateTime-Struktur (die eine System.DateTime zurückgibt) verwenden, um den Vergleich elegant und ohne explizites Casting durchzuführen.

Sie könnten this article informativ finden.

0

Ich hoffe, Sie finden diesen Artikel (DATEDIFF Function Demystified) nützlich, obwohl es für Datetime in SQL spezifisch ist, es ist hilfreich für das Verständnis, wie es auf der Datenbankseite behandelt wird.

15

Vorsicht beim Vergleich von DateTimes, die in C# generiert wurden. Die DateTime Struktur in C# hat eine höhere Genauigkeit als die datetime Art in SQL Server. Wenn Sie also in C# eine DateTime erzeugen (zB von DateTime.Now), diese in der Datenbank speichern und zurückholen, wird es höchstwahrscheinlich anders sein.

Zum Beispiel der folgende Code:

using(SqlConnection conn = new SqlConnection("Data Source=.;Integrated Security=SSPI")) 
using(SqlCommand cmd = new SqlCommand("SELECT @d", conn)){ 
    DateTime now = DateTime.Now; 
    cmd.Parameters.Add(new SqlParameter("@d", now)); 
    conn.Open(); 
    DateTime then = (DateTime)cmd.ExecuteScalar(); 
    Console.WriteLine(now.ToString("yyyy/MM/dd HH:mm:ss.fffffff")); 
    Console.WriteLine(then.ToString("yyyy/MM/dd HH:mm:ss.fffffff")); 
    Console.WriteLine(then - now); 

}

gibt das folgende Beispielergebnis.

 
2009.06.20 12:28:23.6115968 
2009.06.20 12:28:23.6100000 
-00:00:00.0015968 

So in dieser Situation würden Sie überprüfen möchten, dass der Unterschied in einem gewissen epsilon ist:

Math.Abs((now - then).TotalMilliseconds) < 3 

Beachten Sie, dass dies kein Problem ist, wenn Sie den Vergleich von zwei Datetimes aus der abgerufene Datenbank oder eine Datetime aus Komponenten mit zweiter oder größerer Granularität.

Siehe auch: this blog post

Siehe etwa Genauigkeit beachten Sie, wo es "Abgerundete zu Schritten von 0,000, 0,003 bzw. 0,007 Sekunden" die Anweisung