Tengo dos valores de fecha, uno ya almacenado en la base de datos y el otro seleccionado por el usuario usando DatePicker. El caso de uso es buscar una fecha particular en la base de datos.
El valor ingresado previamente en la base de datos siempre tiene un componente de hora de 12:00:00, mientras que la fecha ingresada desde el selector tiene un componente de tiempo diferente.
Solo estoy interesado en los componentes de fecha y me gustaría ignorar el componente de tiempo.
¿Cuáles son las formas de hacer esta comparación en C #?
Además, ¿cómo hacer esto en LINQ?
ACTUALIZACIÓN: En LINQ to Entities, lo siguiente funciona bien.
e => DateTime.Compare(e.FirstDate.Value, SecondDate) >= 0
c#
linq
entity-framework
linq-to-entities
datetime-comparison
lapiz pizarra
fuente
fuente
Respuestas:
NOTA: en el momento de escribir esta respuesta, la relación EF no estaba clara (que se editó en la pregunta después de que se escribió esto). Para un enfoque correcto con EF, verifique la respuesta de Mandeeps .
Puede utilizar la
DateTime.Date
propiedad para realizar una comparación de solo fecha.fuente
EntityFunctions.TruncateTime
ciertamente parece ser el camino a seguir en estos días (estuvo disponible en .NET 4, que se lanzó un año después de que se hizo esta pregunta).Utilice la clase
EntityFunctions
para recortar la parte de tiempo.Fuente: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/84d4e18b-7545-419b-9826-53ff1a0e2a62/
ACTUALIZAR
A partir de EF 6.0 y posteriores, EntityFunctions se reemplaza por DbFunctions .
fuente
EntityFunctions
se ha desaprobado a favor deSystem.Data.Entity.DbFunctions
(al menos) EF6. Puede que haya sido antes.Creo que esto podría ayudarte.
Hice una extensión porque tengo que comparar fechas en repositorios llenos de datos EF y, por lo tanto, .Date no era una opción ya que no está implementado en la traducción de LinqToEntities.
Aquí está el código:
entonces puedes usarlo de esta manera.
fuente
Si usa la
Date
propiedad para entidades de base de datos, obtendrá una excepción:Puedes usar algo como esto:
fuente
Para hacerlo en LINQ to Entities, debe usar métodos compatibles :
Feo, pero funciona y está hecho en el servidor de base de datos.
fuente
Aquí hay una forma diferente de hacerlo, pero solo es útil si SecondDate es una variable que está pasando:
Creo que debería funcionar
fuente
DateTime = x.Date;
me faltaba. Si usévar
, o tenía el valor en línea en la comparación, falló con la excepción informada. Gracias.e.FirstDate.Value <= endDate
ae.FirstDate.Value < endDate
, puede eliminar el.AddTicks(-1)
.También puedes usar esto:
DbFunctions.DiffDays(date1, date2) == 0
fuente
puede usar el método DbFunctions.TruncateTime () para esto.
fuente
Simplemente compare siempre la propiedad Date de DateTime, en lugar de la fecha y hora completa.
Cuando realice su consulta LINQ, use date.Date en la consulta, es decir:
fuente
candidate.Date >= base.Date
. En teoría, lacandidate.Date
hora debe ser> = 12:00:00, por lo que usar la propiedad Date es redundante, pero seguiré el consejo de Reed.Así es como hago esto.
fuente
// Nota para usuarios / codificadores de Linq
Esto debería brindarle la comparación exacta para verificar si una fecha está dentro del rango cuando se trabaja con la entrada de un usuario, por ejemplo, selector de fechas:
donde fecha de inicio y fecha de finalización son valores de un selector de fechas.
fuente
Sin tiempo que intentar así:
fuente
Puede utilizar el siguiente enlace para comparar 2 fechas sin tiempo:
la función Comparar devuelve 3 valores diferentes: -1 0 1 que significa dt1> dt2, dt1 = dt2, dt1
fuente
Pruebe esto ... Funciona bien para comparar las propiedades de fecha entre dos tipos de fecha y hora:
PD. Es una solución provisional y una práctica realmente mala, nunca debe usarse cuando se sabe que la base de datos puede traer miles de registros ...
fuente