Wie vergleiche ich nur Datum ohne Uhrzeit in DateTime-Typen in Linq mit SQL mit Entity Framework?

303

Gibt es eine Möglichkeit, zwei DateTimeVariablen in zu vergleichen , Linq2Sqlaber den Zeitteil zu ignorieren?

Die App speichert Elemente in der Datenbank und fügt ein Veröffentlichungsdatum hinzu. Ich möchte die genaue Uhrzeit behalten, kann aber trotzdem das Datum selbst ermitteln.

Ich möchte die tatsächliche Tageszeit vergleichen 12/3/89 12:43:34und 12/3/89 11:22:12ignorieren, damit beide als gleich angesehen werden.

Ich denke, ich kann alle Tageszeiten einstellen, 00:00:00bevor ich vergleiche, aber ich möchte eigentlich die Tageszeit wissen, die ich nur auch nach Datum vergleichen möchte.

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

Ernsthaft
quelle

Antworten:

534

Versuchen Sie, die DateEigenschaft für das DateTimeObjekt zu verwenden ...

if(dtOne.Date == dtTwo.Date)
    ....
Quintin Robinson
quelle
25
Wenn Sie irgendwann nach Anfang 2017 hier landen und nach einer Möglichkeit suchen, Daten in einer Entity Framework-Umgebung zu vergleichen, wie ich es getan habe, lesen Sie die Antwort von Alejandro und den Kommentar von wasatchWizard.
Mike Devenney
8
Wenn Sie irgendwann nach Mitte 2018 hier landen und nach einer Möglichkeit suchen, einen weiteren äußerst hilfreichen Kommentar wie den oben genannten zu lesen, haben Sie kein Glück.
Nardnob
4
Wenn Sie irgendwann nach Anfang 2019 hier landen und nach Comic-Erleichterung suchen, haben Sie sie gefunden.
Phil Ringsmuth
1
Dies ist absolut NICHT die richtige Antwort. Das OP sagte ausdrücklich, dass Linq to SQL und datetime.date in Linq-Ausdrücken NICHT zulässig sind.
Philip Vaughn
2
Wenn Sie irgendwann nach Anfang 2020 hier landen, hoffe ich, dass Sie auf sich selbst aufpassen und während der Pandemiekrisen des Coronavirus zu Hause bleiben. Gehen Sie 2021 hierher zurück!
Herr Ott
61

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

dateTime1.Date.CompareTo(dateTime2.Date);
Reed Copsey
quelle
18
Was genau meinst du mit "wahrem Vergleich"?
Randolpho
6
Randolpho: Wenn Sie == verwenden, erhalten Sie Gleichheit, unabhängig davon, ob die beiden Daten gleich oder unterschiedlich sind. CompareTo wird sie ~ vergleichen ~, dh: Sie können in einem Durchgang feststellen, ob Datum1> Datum2, Datum1 <Datum2 oder Datum1 == Datum2.
Reed Copsey
6
@ReedCopsey Kannst du nicht einfach (dateTime1.Date <dateTime1.Date) verwenden?
David
14
Aber wer will -1, 0und 1, wirklich? Sie sind nur magische Zahlen, die "weniger", "gleich" und "größer" darstellen. Und Sie müssen die resultierende Ganzzahl anschließend mit etwas "vergleichen", da es drei mögliche Werte gibt. Ich muß mit @ David einig , dass es viel natürlicher zu bedienen ist dateTime1.Date < dateTime1.Date, und in ähnlicher Weise mit <=, >und >=in den meisten Anwendungen.
Jeppe Stig Nielsen
8
@JeppeStigNielsen Wenn Sie dies in irgendetwas verwenden, das einen Vergleich sortiert oder nimmt, dann möchten Sie es - ansonsten möchten Sie normalerweise nur die Operatoren.
Reed Copsey
45

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 es nur verwenden dtOne.Date == dtTwo.Date, funktioniert es nicht mit LINQ (Fehler: Das angegebene Typmitglied 'Date' wird in LINQ to Entities nicht unterstützt.)

Alejandro del Río
quelle
22
Dies funktioniert hervorragend mit LINQ to Entities. Allerdings EntityFunctionswurde in .NET 4.5.2 veraltet. Verwenden Sie stattdessen : DbFunctions.TruncateTime. Es scheint die identische Methode zu sein, gerade verschoben ..
Wasatchwizard
25

Wenn Sie Entity Framework <v6.0 verwenden, verwenden EntityFunctions.TruncateTime Sie Wenn Sie Entity Framework> = v6.0 verwenden, verwenden SieDbFunctions.TruncateTime

Verwenden Sie entweder (basierend auf Ihrer EF-Version) eine beliebige DateTimeKlasseneigenschaft, die Sie in Ihrer Linq-Abfrage verwenden möchten

Beispiel

var list = db.Cars.Where(c=> DbFunctions.TruncateTime(c.CreatedDate) 
                                       >= DbFunctions.TruncateTime(DateTime.UtcNow));
Korayem
quelle
Nur eine Erinnerung hier: Solange es Linq to Entity ist.
neugierigBoy
Dies sollte die richtige Antwort sein (Stand 2019). EntityFunctions wird abgeschrieben und Sie dürfen datetime.date nicht in einem Lambda-Ausdruck verwenden (aus welchem ​​Grund auch immer - ich meine ernsthaft ... warum haben sie das nicht behoben?!).
Philip Vaughn
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....");
}
Devarajan.T
quelle
9
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 nullfähige DateFields verwenden.

Code Geek
quelle
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
   }
Mohan Sharma
quelle
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 gibt die Anzahl der Tage für das Alter an. Wenn der Wert negativ ist, fällt das Startdatum nach dem Enddatum. Dies ist eine gute Prüfung.

dgsjr
quelle
1

Sie können Equals oder CompareTo verwenden .

Gleich : Gibt einen Wert zurück, der angibt, ob zwei DateTime- Instanzen denselben Datums- und Zeitwert haben.

CompareTo Rückgabewert :

  1. Kleiner als Null : Wenn diese Instanz früher als der Wert ist.
  2. Null : Wenn diese Instanz mit dem Wert identisch ist.
  3. Größer als Null : Wenn diese Instanz später als der Wert ist.

DateTime ist nullbar:

DateTime? first = new DateTime(1992,02,02,20,50,1);
DateTime? second = new DateTime(1992, 02, 02, 20, 50, 2);

if (first.Value.Date.Equals(second.Value.Date))
{
    Console.WriteLine("Equal");
}

oder

DateTime? first = new DateTime(1992,02,02,20,50,1);
DateTime? second = new DateTime(1992, 02, 02, 20, 50, 2);


var compare = first.Value.Date.CompareTo(second.Value.Date);

switch (compare)
{
    case 1:
        Console.WriteLine("this instance is later than value.");
        break;
    case 0:
        Console.WriteLine("this instance is the same as value.");
        break;
    default:
        Console.WriteLine("this instance is earlier than value.");
        break;
}

DateTime ist nicht nullbar:

DateTime first = new DateTime(1992,02,02,20,50,1);
DateTime second = new DateTime(1992, 02, 02, 20, 50, 2);

if (first.Date.Equals(second.Date))
{
    Console.WriteLine("Equal");
}

oder

DateTime first = new DateTime(1992,02,02,20,50,1);
DateTime second = new DateTime(1992, 02, 02, 20, 50, 2);


var compare = first.Date.CompareTo(second.Date);

switch (compare)
{
    case 1:
        Console.WriteLine("this instance is later than value.");
        break;
    case 0:
        Console.WriteLine("this instance is the same as value.");
        break;
    default:
        Console.WriteLine("this instance is earlier than value.");
        break;
}
Reza Jenabi
quelle
0

Verwenden Sie in Ihrer Join- oder Where-Klausel die DateEigenschaft der Spalte. Hinter den Kulissen wird eine CONVERT(DATE, <expression>)Operation ausgeführt. Auf diese Weise können Sie Daten ohne Zeitangabe vergleichen.

Adam Robinson
quelle
0

Du kannst es versuchen

if(dtOne.Year == dtTwo.Year && dtOne.Month == dtTwo.Month && dtOne.Day == dtTwo.Day)
  ....
Cristian
quelle
-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))
        {
        }
Hetuk Upadhyay
quelle
5
-1: Warum nicht einfach auf DateTime analysieren und die Methode von @Quintin Robinson verwenden? Dies ist der Code, den ich im The Daily WTF erwarten würde.
William Hurst
Sie müssen nicht so viele Variablen erstellen, da dies die Antwortzeit für eine so einfache Aufgabe verlängert.
Nayan Katkani