Come confrontare solo i tipi Date senza ora nei DateTime in Linq a SQL con Entity Framework?


303

C'è un modo per confrontare due DateTimevariabili Linq2Sqlma per ignorare la parte Time.

L'app archivia gli elementi nel DB e aggiunge una data pubblicata. Voglio mantenere l'ora esatta, ma essere comunque in grado di tirare entro la data stessa.

Voglio fare un confronto 12/3/89 12:43:34e 12/3/89 11:22:12farlo ignorare l'ora reale del giorno, quindi entrambi sono considerati uguali.

Immagino di poter impostare tutte le ore del giorno su 00:00:00prima di confrontare, ma in realtà voglio sapere l'ora del giorno che voglio solo essere in grado di confrontare solo per data.

Ho trovato un codice con lo stesso problema e confrontano l'anno, il mese e il giorno separatamente. C'è un modo migliore per farlo?

Risposte:


534

prova a usare la Dateproprietà DateTimesull'oggetto ...

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

25
Se finisci qui qualche volta dopo l'inizio del 2017 alla ricerca di un modo per confrontare le date in un ambiente Entity Framework come ho fatto, dai un'occhiata alla risposta qui sotto di Alejandro e al commento di wasatchWizard.
Mike Devenney,

8
Se finisci qui dopo la metà del 2018 in cerca di un modo per leggere un altro commento estremamente utile come quello sopra, sei sfortunato.
nardnob,

4
Se finisci qui dopo l'inizio del 2019 in cerca di sollievo comico, l'hai trovato.
Phil Ringsmuth,

1
Questa NON è assolutamente la risposta corretta. L'OP ha detto specificamente Linq a SQL e datetime.date NON è consentito nelle espressioni linq.
Philip Vaughn,

2
Se finirai qui dopo l'inizio del 2020, spero che ti prenderesti cura di te e starai a casa durante la crisi di pandemia da coronavirus. Torna qui nel 2021!
Mr. Ott

61

Per un vero confronto, puoi usare:

dateTime1.Date.CompareTo(dateTime2.Date);

18
Cosa intendi esattamente con "vero confronto"?
Randolpho,

6
Randolpho: l'uso di == ti darà l'uguaglianza, quindi se le due date sono uguali o diverse. CompareTo li confronterà ~, cioè: ti darà un modo in un passaggio per dire se date1> date2, date1 <date2 o date1 == date2.
Reed Copsey,

6
@ReedCopsey Non puoi semplicemente usare (dateTime1.Date <dateTime1.Date)?
David

14
Ma chi vuole -1, 0e 1, davvero? Sono solo numeri magici che rappresentano "meno", "uguale" e "maggiore". E dovrai "confrontare" il numero intero risultante con qualcosa in seguito perché ci sono tre possibili valori. Devo concordare con @David che è molto più naturale usare dateTime1.Date < dateTime1.Date, e allo stesso modo con <=, >e >=, nella maggior parte delle applicazioni.
Jeppe Stig Nielsen,

8
@JeppeStigNielsen Se lo stai usando in qualcosa che ordina o prende una comaprison, allora lo vuoi - altrimenti, in genere, vuoi solo gli operatori.
Reed Copsey,

45

Ecco come lo faccio per lavorare con LINQ.

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

Se lo usi solo dtOne.Date == dtTwo.Datenon funzionerà con LINQ (errore: il membro del tipo specificato 'Data' non è supportato in LINQ to Entities)


22
Funziona alla grande con LINQ to Entities. Tuttavia, EntityFunctionsè stato deprecato in .NET 4.5.2. Utilizzare questo, invece: DbFunctions.TruncateTime. Sembra essere lo stesso metodo, appena spostato ...
wasatchwizard

25

Se si utilizza Entity Framework <v6.0, quindi utilizzare EntityFunctions.TruncateTime Se si utilizza Entity Framework> = v6.0, quindi utilizzareDbFunctions.TruncateTime

Utilizzare uno (basato sulla versione EF) attorno a qualsiasi DateTimeproprietà di classe che si desidera utilizzare all'interno della query Linq

Esempio

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

Solo un promemoria qui: purché sia ​​Linq a Entità.
curiousBoy

Questa dovrebbe essere la risposta corretta (a partire dal 2019). EntityFunctions è ammortizzato e non ti è permesso usare datetime.date in un'espressione lambda (per qualsiasi motivo, intendo sul serio ... perché non l'hanno risolto ?!).
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....");
}

9
DateTime? NextChoiceDate = new DateTime();
DateTIme? NextSwitchDate = new DateTime();
if(NextChoiceDate.Value.Date == NextSwitchDate.Value.Date)
{
Console.WriteLine("Equal");
}

Puoi usarlo se stai usando DateField nullable.


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
   }

2
DateTime econvertedDate = Convert.ToDateTime(end_date);
DateTime sconvertedDate = Convert.ToDateTime(start_date);

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

Il valore diff rappresenta il numero di giorni per l'età. Se il valore è negativo, la data di inizio cade dopo la data di fine. Questo è un buon controllo.


1

Puoi usare Equals o CompareTo .

Uguale : restituisce un valore che indica se due istanze di DateTime hanno lo stesso valore di data e ora.

Confronta per restituire valore :

  1. Minore di zero : se questa istanza è precedente al valore.
  2. Zero : se questa istanza è uguale al valore.
  3. Maggiore di zero : se questa istanza è successiva al valore.

DateTime è nullable:

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");
}

o

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 non è nullable:

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");
}

o

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;
}

0

Nella clausola join o where, utilizzare la Dateproprietà della colonna. Dietro le quinte, questo esegue CONVERT(DATE, <expression>)un'operazione. Ciò dovrebbe consentire di confrontare le date senza l'ora.


0

Puoi provare

if(dtOne.Year == dtTwo.Year && dtOne.Month == dtTwo.Month && dtOne.Day == dtTwo.Day)
  ....

-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))
        {
        }

5
-1: Perché non analizzare solo DateTime e usare il metodo di @Quintin Robinson? Questo è il codice che mi aspetterei di vedere su The Daily WTF.
William Hurst,

Non è necessario creare così tante variabili poiché aumenta i tempi di risposta per un compito così semplice.
Nayan Katkani,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.