none
Como trabajar con fechas en Linq RRS feed

  • Pregunta

  • Hola

    Trabajo en una app Windows Forms, VS 2019 Community, SQL Server 2014 Express Edition

    Estoy implementando una consulta que debe traer información por un rango de fechas, en la base de datos tengo el siguiente registro.

    OrdenInventarioId|NumeroOrden|Fecha              |EstadoOrden|
    -----------------|-----------|-------------------|-----------|
                    1|0000000001 |2020-02-04 18:04:39|          1|

    Al realizar la consulta enviando las condicionales desde 04/02/2020 hasta 04/02/2020 me debería traer el registro pero no lo hace, solo me muestra la información cuando le envió 04/02/2020 hasta 05/02/2020. ¿Como puedo solucionar ese inconveniente?

    La consulta Linq que tengo implementada es la siguiente.

    var result = from oi in context.OrdenInventarios
                                 where
                                 //(filter.HasNumberOrder && oi.NumeroOrden.Contains(filter.NumeroOrden))
                                 //||
                                 //(filter.HasEstadoOrden && oi.EstadoOrden == filter.EstadoOrden)
                                 //||
                                 (filter.HasFechaEmisionDesde && oi.Fecha >= DbFunctions.TruncateTime(filter.FechaEmisionDesde))
                                 &&
                                 (filter.HasFechaEmisionHasta && oi.Fecha <= DbFunctions.TruncateTime(filter.FechaEmisionHasta))
                                 select
                                 new UniversalExtend()
                                 {
                                     Id = oi.OrdenInventarioId,
                                     NumeroComprobante = oi.NumeroOrden,
                                     FechaEmision = oi.Fecha,
                                     EstadoOrden = oi.EstadoOrden
                                 };

    Saludos!


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    sábado, 8 de febrero de 2020 18:30

Respuestas

  • hola

    Lo que debes truncar es la fecha de la tabla, no la que pones por parametro

    (filter.HasFechaEmisionDesde && DbFunctions.TruncateTime(oi.Fecha) >= filter.FechaEmisionDesde)
    &&
    (filter.HasFechaEmisionHasta && DbFunctions.TruncateTime(oi.Fecha) <= filter.FechaEmisionHasta)


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    sábado, 8 de febrero de 2020 19:08
  • Hola, tu primera propuesta es válida ya que sólo se revisa la parte "Date" de un campo de tipo datetime. 

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta Pedro Ávila sábado, 8 de febrero de 2020 20:50
    sábado, 8 de febrero de 2020 20:47
    Moderador
  • hola

    Creo que con cualquiera de las dos tecnica si funcionan y retorna los registros vas a llegar a lo mismo, aplica la que mas guste y ves queda mejor en el codigo

    En cuestion aperformance no le veo diferencia

    Igual eso de usar AddMinutes() AddHours() etc queda bastante feo en el codigo, quizas podrias simarle un dia a la fecha y restarle un minuto, recuerdo haber visto que en algunas respuestas aplican eso

    saldos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Pedro Ávila lunes, 10 de febrero de 2020 14:44
    sábado, 8 de febrero de 2020 22:00

Todas las respuestas

  • hola

    Lo que debes truncar es la fecha de la tabla, no la que pones por parametro

    (filter.HasFechaEmisionDesde && DbFunctions.TruncateTime(oi.Fecha) >= filter.FechaEmisionDesde)
    &&
    (filter.HasFechaEmisionHasta && DbFunctions.TruncateTime(oi.Fecha) <= filter.FechaEmisionHasta)


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    sábado, 8 de febrero de 2020 19:08
  • Hola @Leandro

    Si funciono con la solución que propusiste, mi pregunta es la siguiente: ¿Que grado de precisión tiene hacerlo de esta manera?, de esta manera al aplicar el TruncateTime en la tabla solo son fechas de dd/MM/YYY

    FechaEmisionDesde = chkFechaEmisionDesde.Checked
                    ? (DateTime?)dtpFechaEmisionDesde.Value.Date
                    : null,
                    HasFechaEmisionDesde = chkFechaEmisionDesde.Checked ? true : false,
                    FechaEmisionHasta = chkFechaEmisionHasta.Checked
                    ? (DateTime?)dtpFechaEmisionHasta.Value.Date
                    : null,
                    HasFechaEmisionHasta = chkFechaEmisionHasta.Checked ? true : false

    Query Linq

    (filter.HasFechaEmisionDesde && DbFunctions.TruncateTime(oi.Fecha) >= filter.FechaEmisionDesde)
                                 &&
                                 (filter.HasFechaEmisionHasta && DbFunctions.TruncateTime(oi.Fecha) <= filter.FechaEmisionHasta)

    Que opinas de esta otra implementación

    FechaEmisionDesde = chkFechaEmisionDesde.Checked
                    ? (DateTime?)dtpFechaEmisionDesde.Value.Date.AddHours(00).AddMinutes(00).AddSeconds(00)
                    : null,
                    HasFechaEmisionDesde = chkFechaEmisionDesde.Checked ? true : false,
                    FechaEmisionHasta = chkFechaEmisionHasta.Checked
                    ? (DateTime?)dtpFechaEmisionHasta.Value.Date.AddHours(23).AddMinutes(59).AddSeconds(59).AddMilliseconds(999)
                    : null,
                    HasFechaEmisionHasta = chkFechaEmisionHasta.Checked ? true : false
    

    Query Linq

    (filter.HasFechaEmisionDesde && oi.Fecha >= filter.FechaEmisionDesde)
                                 &&
                                 (filter.HasFechaEmisionHasta && oi.Fecha <= filter.FechaEmisionHasta)

    ¿Cual de las dos propuestas es la mas recomendable?

    Saludos!



    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    sábado, 8 de febrero de 2020 20:19
  • Hola, tu primera propuesta es válida ya que sólo se revisa la parte "Date" de un campo de tipo datetime. 

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta Pedro Ávila sábado, 8 de febrero de 2020 20:50
    sábado, 8 de febrero de 2020 20:47
    Moderador
  • hola

    Creo que con cualquiera de las dos tecnica si funcionan y retorna los registros vas a llegar a lo mismo, aplica la que mas guste y ves queda mejor en el codigo

    En cuestion aperformance no le veo diferencia

    Igual eso de usar AddMinutes() AddHours() etc queda bastante feo en el codigo, quizas podrias simarle un dia a la fecha y restarle un minuto, recuerdo haber visto que en algunas respuestas aplican eso

    saldos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Pedro Ávila lunes, 10 de febrero de 2020 14:44
    sábado, 8 de febrero de 2020 22:00