2009-03-25 4 views
214

Gibt es eine Möglichkeit, 2 DateTime-Variablen in Linq2Sql zu vergleichen, aber den Teil Zeit zu ignorieren.So vergleichen Sie nur Date ohne Zeit in DateTime Typen in Linq to SQL mit Entity Framework?

Die App speichert Elemente in der Datenbank und fügt ein Veröffentlichungsdatum hinzu. Ich möchte die genaue Zeit behalten, aber immer noch in der Lage sein, nach dem Datum selbst zu ziehen.

Ich möchte 12/3/89 12:43:34 und 12/3/89 11:22:12 vergleichen und habe es die tatsächliche Uhrzeit ignorieren, so dass diese beiden als gleich betrachtet werden.

Ich denke, ich kann alle Zeiten des Tages auf 00:00:00 setzen, bevor ich vergleiche, aber ich möchte tatsächlich die Uhrzeit wissen, ich möchte nur in der Lage sein, nur nach Datum zu vergleichen.

Ich habe Code gefunden, der das gleiche Problem hat, und sie vergleichen Jahr, Monat und Tag getrennt. Gibt es einen besseren Weg, dies zu tun?

Antwort

375

versuchen mit der Date Eigenschaft auf dem DateTime Objekt ...

if(dtOne.Date == dtTwo.Date) 
    .... 
+9

Wenn Sie auch hier irgendwann nach einem Weg suchen Anfang 2017 am Ende Daten in einer Entity Framework-Umgebung zu vergleichen, wie ich unten durch Alejandro die Antwort tat überprüfen und den Kommentar von wasatchWizard. –

49

Für einen echten Vergleich, können Sie verwenden:

dateTime1.Date.CompareTo(dateTime2.Date); 
+0

gibt nicht "==" die Ergebnisse von CompareTo intern zurück? –

+16

Was genau meinen Sie mit "echten Vergleich"? – Randolpho

+0

SnOrfus: Nicht immer. Viele Implementierungen geben a.CompareTo (b) == 0 für == zurück, aber das hängt von der Implementierung ab. Ich habe die interne Implementierung der Gleichheit von DateTime nicht überprüft. –

0

In Ihrem beizutreten oder where-Klausel, verwenden Sie die Eigenschaft Date der Spalte. Hinter den Kulissen führt dies eine CONVERT(DATE, <expression>) Operation aus. Dies sollte Ihnen erlauben, Daten ohne die Zeit zu vergleichen.

-16
 int o1 = date1.IndexOf("-"); 
     int o2 = date1.IndexOf("-",o1 + 1); 
     string str11 = date1.Substring(0,o1); 
     string str12 = date1.Substring(o1 + 1, o2 - o1 - 1); 
     string str13 = date1.Substring(o2 + 1); 

     int o21 = date2.IndexOf("-"); 
     int o22 = date2.IndexOf("-", o1 + 1); 
     string str21 = date2.Substring(0, o1); 
     string str22 = date2.Substring(o1 + 1, o2 - o1 - 1); 
     string str23 = date2.Substring(o2 + 1); 

     if (Convert.ToInt32(str11) > Convert.ToInt32(str21)) 
     { 
     } 
     else if (Convert.ToInt32(str12) > Convert.ToInt32(str22)) 
     { 
     } 
     else if (Convert.ToInt32(str12) == Convert.ToInt32(str22) && Convert.ToInt32(str13) > Convert.ToInt32(str23)) 
     { 
     } 
+7

-1: String-Manipulation sollte nicht Teil der Lösung sein –

+5

-1: Warum nicht einfach zu DateTime analysieren und @Quintin Robinson-Methode verwenden? Das ist Code, den ich im The Daily WTF erwarten würde. –

+3

-1 Ein sehr komplexer Weg, um ein einfaches Problem zu lösen. – Wade73

12
DateTime dt1 = DateTime.Now.Date; 
DateTime dt2 = Convert.ToDateTime(TextBox4.Text.Trim()).Date; 
if (dt1 >= dt2) 
{ 
    MessageBox.Show("Valid Date"); 
} 
else 
{ 
    MessageBox.Show("Invalid Date... Please Give Correct Date...."); 
} 
2
DateTime econvertedDate = Convert.ToDateTime(end_date); 
DateTime sconvertedDate = Convert.ToDateTime(start_date); 

TimeSpan age = econvertedDate.Subtract(sconvertedDate); 
Int32 diff = Convert.ToInt32(age.TotalDays); 

Der Diff-Wert steht für die Anzahl der Tage für das Alter. Wenn der Wert negativ ist, fällt das Startdatum nach dem Enddatum. Das ist ein guter Check.

23

So mache ich das, um mit LINQ zu arbeiten.

DateTime date_time_to_compare = DateTime.Now; 
//Compare only date parts 
context.YourObject.FirstOrDefault(r => 
       EntityFunctions.TruncateTime(r.date) == EntityFunctions.TruncateTime(date_to_compare)); 

Wenn Sie nur dtOne.Date == dtTwo.Date verwenden, es wird nicht mit LINQ arbeiten (Fehler: Das Mitglied angegebenen Typ 'Datum' in LINQ to Entities wird nicht unterstützt)

+7

Dies funktioniert hervorragend mit LINQ to Entities. "EntityFunctions" wurde in .NET 4.5.2 jedoch nicht weiter unterstützt. Verwenden Sie stattdessen: 'DbFunctions.TruncateTime'. Es scheint die gleiche Methode zu sein, nur bewegt .. – wasatchwizard

+0

Das funktioniert gut thx Mann – jhony3

+0

Danke Mann, gerade was ich brauchte. –

3
DateTime dt1=DateTime.ParseExact(date1,"dd-MM-yyyy",null); 
DateTime dt2=DateTime.ParseExact(date2,"dd-MM-yyyy",null); 

int cmp=dt1.CompareTo(dt2); 

    if(cmp>0) { 
     // date1 is greater means date1 is comes after date2 
    } else if(cmp<0) { 
     // date2 is greater means date1 is comes after date1 
    } else { 
     // date1 is same as date2 
    } 
4
DateTime? NextChoiceDate = new DateTime(); 
DateTIme? NextSwitchDate = new DateTime(); 
if(NextChoiceDate.Value.Date == NextSwitchDate.Value.Date) 
{ 
Console.WriteLine("Equal"); 
} 

Sie können dies verwenden, wenn Sie verwenden Nullable DateFields.

10

Sie sollten EntityFunctions.TruncateTime mit EF < 6.0 und DbFunctions.TruncateTime in EF> 6.0 um jede DateTime Eigenschaft, die Sie in Ihrem Linq verwenden möchten verwenden.

Beispiel

var list = db.Cars.Where(c=> DbFunctions.TruncateTime(c.CreatedDate) 
             > DbFunctions.TruncateTime(DateTime.UtcNow)); 
Verwandte Themen