2009-03-25 4 views
214

C'è un modo per confrontare 2 variabili DateTime in Linq2Sql ma ignorare la parte Time.Come confrontare solo Data senza ora nei tipi DateTime in Linq a SQL con Entity Framework?

L'app memorizza gli elementi nel DB e aggiunge una data di pubblicazione. Voglio mantenere l'ora esatta ma sono comunque in grado di attirare la data stessa.

Desidero confrontare 12/3/89 12:43:34 e 12/3/89 11:22:12 e ignorare l'ora del giorno in modo che entrambi siano considerati uguali.

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

Ho trovato un codice che presenta lo stesso problema e confronta separatamente anno, mese e giorno. C'è un modo migliore per farlo?

risposta

375

provare a utilizzare la proprietà Date sul DateTime oggetto ...

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

Se si finisce qui qualche tempo dopo presto 2017 alla ricerca di un modo per confrontare le date in un ambiente Entity Framework come ho fatto controllare la risposta qui sotto di Alejandro e il commento di wasatchWizard. –

49

Per un confronto vero, è possibile utilizzare:

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

non "==" restituisce internamente i risultati di CompareTo? –

+16

Cosa intendi esattamente per "confronto vero"? – Randolpho

+0

SnOrfus: non sempre. Molte implementazioni restituiscono a.CompareTo (b) == 0 per ==, ma ciò dipende dall'implementazione. Non ho controllato l'implemetnazione interna di DateTime dell'uguaglianza. –

0

Nella tua aderire o clausola WHERE, utilizzare la proprietà Date della colonna. Dietro le quinte, esegue un'operazione CONVERT(DATE, <expression>). Questo dovrebbe consentire di confrontare le date senza il tempo.

-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: la manipolazione delle stringhe non dovrebbe essere parte della soluzione –

+5

-1: perché non analizzare solo DateTime e utilizzare il metodo @Quintin Robinson? Questo è il codice che mi aspetto di vedere su The Daily WTF. –

+3

-1 Un modo molto complesso per risolvere un semplice problema. – 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); 

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.

23

Ecco come 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 si utilizza solo dtOne.Date == dtTwo.Date non funzionerà con LINQ (Errore: il tipo di utente 'Data' specificato non è supportato in LINQ to Entities)

+7

Questo funziona perfettamente con LINQ alle entità. Tuttavia, 'EntityFunctions' è stato deprecato in .NET 4.5.2. Usalo invece: 'DbFunctions.TruncateTime'. Sembra essere il metodo identico, appena spostato .. – wasatchwizard

+0

Questo funziona great thx man – jhony3

+0

Grazie amico proprio quello di cui avevo bisogno. –

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

È possibile utilizzare questo se stai usando i DateFields nullable.

10

Si dovrebbe usare EntityFunctions.TruncateTime con EF < 6.0 e DbFunctions.TruncateTime in EF> 6.0 intorno a qualsiasi DateTime proprietà che si desidera utilizzare all'interno del vostro LINQ.

Esempio

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