6

oí gente diciendo que la comparación de fecha y hora no funciona solo debido a la parte de tiempo porque datetime tiene parte de tiempo.¿Cómo realizo la comparación de fecha-parte en EF

en SQL Siempre comparar como fecha y hora de esta manera y funciona bien

select * from employee 
where convert(varchar,dob,112) > '20111201' // this yyyymmdd format. 

¿Cómo podría simular esto en una consulta LINQ?

+1

¿Se refiere a Entity Framework (= LINQ to Entities) y LINQ to SQL (pre EF ORM)? – abatishchev

+1

FWIW, si está usando SQL Server 2008 o superior, probablemente debería estar usando 'Date' (en lugar de' DateTime') para campos cuya porción de tiempo sea irrelevante (es poco probable que TENGA la hora del día que alguien nació, y aún menos probable que sea significativo para usted). Usar 'DateTime' cuando' Date' está disponible y no te importa el tiempo sería como almacenar todos tus datos numéricos en un 'float' independientemente de si los datos son intrínsecamente o no. –

Respuesta

2

Lo único a tener en cuenta es que las operaciones en las estructuras de DateTime que representan las columnas de la base de datos no se traducen en SQL. Por lo tanto, no se puede escribir una consulta como:

from e in EfEmployeeContext 
where e.DOB.Date > new DateTime(2011,12,01); 

... porque e.DOB representa la columna de la fecha de nacimiento en la base de datos, y EF no sabrá cómo traducir la Fecha de sub-propiedad.

Sin embargo, hay una solución fácil dependiendo de qué fechas quiere:

  • Si desea incluir todos los empleados que tienen una fecha de nacimiento en el 12/01/2011, así como los nacidos después de esa fecha, a continuación, simplemente consulta:

    from e in EfEmployeeContext 
    where e.DOB > new DateTime(2011,12,01); 
    
  • Si desea incluir sólo los empleados nacidos después del 12/01/2011, a continuación, consulta:

    from e in EfEmployeeContext 
    where e.DOB >= new DateTime(2011,12,02); 
    

En resumen, los criterios, es decir, un DateTime constante o literal con el que compara, se pueden configurar como lo desee. Simplemente no puede hacer modificaciones radicales a las propiedades que representan columnas DB dentro del predicado where. Eso significa que no se puede comparar una columna DateTime a una proyección de otra columna DateTime, por ejemplo:

//get all employees that were hired in the first six months of the year 
    from e in EfEmployeeContext 
    where e.HireDate < new DateTime(e.HireDate.Year, 7, 1); 
+0

hace este código de e en EfEmployeeContext donde e.DOB> new DateTime (2011,12,01); Trabajar en toda cultura porque el formato de fecha de los Estados Unidos es diferente donde el Reino Unido tiene diferente. – Thomas

+0

El constructor de un DateTime siempre toma el año primero, luego el mes y luego el día, independientemente de la cultura que se pueda usar para mostrarlo como una cadena. – KeithS

10

Si está utilizando .NET 4 o superior, sólo tiene que utilizar el método EntityFunctions.TruncateTime ayudante. Esto traducirá este tipo de conversión de fecha y hora a SQL para usted.

from e in EfEmployeeContext 
where EntityFunctions.TruncateTime(e.DOB) > new DateTime(2011,12,01); 
+0

si estoy usando linq 2 sql entonces ¿cómo trabajo? – Thomas

+3

Si está utilizando 'LINQ to SQL', entonces eliminaría las etiquetas a' EntityFramework' y 'linq-to-entities', así como la referencia a EF en el título de su pregunta. Usar LINQ to SQL significa que su pregunta se vuelve irrelevante. – mclark1129

+0

¿La comparación de fechas no puede estar allí cuando las personas usan LINQ to SQL? – Thomas

Cuestiones relacionadas