2009-03-25 60 views
214

¿Hay alguna forma de comparar 2 variables DateTime en Linq2Sql pero ignorar la parte Time?¿Cómo comparar solo la fecha sin hora en tipos de fecha y hora en Linq a SQL con Entity Framework?

La aplicación almacena elementos en el DB y agrega una fecha publicada. Quiero mantener la hora exacta, pero aún así poder sacar la fecha.

Quiero comparar 12/3/89 12:43:34 y 12/3/89 11:22:12 y hacer caso omiso de la hora del día real por lo que ambos se consideran lo mismo.

Supongo que puedo configurar todas las horas del día a 00:00:00 antes de comparar, pero en realidad quiero saber la hora del día. También quiero poder comparar solo por fecha.

Encontré un código que tiene el mismo problema y comparan el año, el mes y el día por separado. ¿Hay una mejor manera de hacer esto?

Respuesta

375

tratar de usar la propiedad Date en el objeto DateTime ...

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

Si al final aquí en algún momento después de la primera 2017 en busca de una manera de comparar las fechas en un entorno Marco de la entidad como lo hice revisar la respuesta a continuación por Alejandro y el comentario de wasatchWizard. –

49

Para una verdadera comparación, se puede utilizar:

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

¿"==" no devuelve los resultados de CompareTo internamente? –

+16

¿Qué quiere decir exactamente con "comparación verdadera"? – Randolpho

+0

SnOrfus: No siempre. Muchas implementaciones devuelven a.CompareTo (b) == 0 para ==, pero eso depende de la implementación. No he comprobado la implementación interna de igualdad de DateTime. –

0

En su unirse o cláusula where, utilizar la propiedad Date de la columna Detrás de escena, esto ejecuta una operación CONVERT(DATE, <expression>). Esto debería permitirle comparar fechas sin tiempo.

-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 manipulación de cadenas no debería ser parte de la solución –

+5

-1: ¿Por qué no simplemente analizar el DateTime y usar el método de @Quintin Robinson? Este es el código que esperaría ver en The Daily WTF. –

+3

-1 Una forma muy compleja de resolver un problema simple. – 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); 

El valor diff representa el número de días para la edad. Si el valor es negativo, la fecha de inicio cae después de la fecha de finalización. Este es un buen control.

23

Así es como hago esto para trabajar 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)); 

Si sólo utiliza dtOne.Date == dtTwo.Date no lo puedo trabajar con LINQ (Error: El tipo de miembro 'Fecha' especificado no es compatible en LINQ a Entidades)

+7

Esto funciona muy bien con LINQ to Entities. Sin embargo, 'EntityFunctions' ha quedado obsoleto en .NET 4.5.2. Use esto en su lugar: 'DbFunctions.TruncateTime'. Parece ser el método idéntico, simplemente se trasladó .. – wasatchwizard

+0

Esto funciona bien thx hombre – jhony3

+0

Gracias hombre justo lo que necesitaba. –

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

Usted puede usar esta opción si está usando DateFields nullable.

10

Debe utilizar EntityFunctions.TruncateTime con EF < 6.0 y DbFunctions.TruncateTime en FE> 6,0 en torno a cualquier DateTime propiedad que desea utilizar dentro de su LINQ.

Ejemplo

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