none
Formato de fechas para busquedas con linq RRS feed

  • Pregunta

  • Buen dia, a los presentes. 

    Sucede que tengo la siguiente consulta para un rango de fechas mediante linq y ajax:

    var Requerimiento = (
                       from n in _DB.Requerimiento
                       orderby n.ID_Req descending
                       select n).ToPagedList(page, 5);
    
                if (fechaIni != "" && fechaFin != "")
                {
                    DateTime fin = Convert.ToDateTime(fechaIni).Date;
                    DateTime inicio = Convert.ToDateTime(fechaFin).Date;
                    if (Request.IsAjaxRequest())
                    {
                        return PartialView("partials/_ListadoReque", Requerimiento.Where(f => f.Fecha_Inicio >= inicio && f.Fecha_Inicio < fin).ToList());
                    }
    
                }

    los parametros  de busqueda de fechas tanto de inicio como final son string:

    string fechaIni = "", string fechaFin = ""

    este string viene con el formato:

    yyyy-MM-dd (ejemplo, 2015-03-31)

    Ahora el formato de fecha que veo en la base de datos es yyyy-MM-dd (ejemplo, 2015-03-31) (SQL server 2008), windows server 2008 en ingles.

    Cuando intento hacer la busqueda en estos rangos de fecha, en debug veo que el formato del datetime, lo traduce como dd/mm/yyyy, es decir lo veo como 31/03/2015 12:00 pm.

    Al comparar en la busqueda pues estos valores no coinciden.

    Hay alguna forma de hacer que tanto la fecha tomada por el usuario y la fecha de la base de datos coincidadn en formatos?

    gracias de antemano.


    sábado, 28 de marzo de 2015 3:20

Respuestas

  • hola

    lo que aconsejaria es que no dividas el linq en dos partes, porque la primera estas paginando y en la segunda aplicas el where sobre esa paginacion, lo cual la query resultante puede resultar cualquier cosa

    ademas si desde el principio detectas que no pasa las validaciones, anula desde alli mismo y retorna una respuesta, por supuesto adaptalo a lo que necesites alli puse un null al model pero puedes cambiarlo

    if (fechaIni == "" || fechaFin == "")
    {
    	return PartialView("partials/_ListadoReque", null);
    }
    
    DateTime fin = Convert.ToDateTime(fechaIni).Today;
    DateTime inicio = Convert.ToDateTime(fechaFin).Today;
    
    var Requerimiento = from n in _DB.Requerimiento
    			where n.Fecha_Inicio >= inicio && n.Fecha_Inicio < fin
    			orderby n.ID_Req descending
    			select n).ToPagedList(page, 5);
    				   
    if (Request.IsAjaxRequest())
    {
    	return PartialView("partials/_ListadoReque", Requerimiento);
    }

    cuando convertir a datetime usa el Today para quitar la componente de la hora, a ver si eso esta afectando

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 28 de marzo de 2015 11:37

Todas las respuestas

  • Hola,

    ¿A tu parecer no coinciden? o ¿los resultados devueltos no son los esperados? 

    El formato de fecha de la base de datos depende del idioma en que está configurado el usuario que inicia sesión para el servicio SQL Server. Lo único que puedo observar es que tanto en la variable como al campo Fecha_Inicio debes de convertirlo a sólo fecha.

    var Requerimiento = (
                       from n in _DB.Requerimiento
                       orderby n.ID_Req descending
                       select n).ToPagedList(page, 5);
    
                if (fechaIni != "" && fechaFin != "")
                {
                    DateTime fin = Convert.ToDateTime(fechaIni);
                    DateTime inicio = Convert.ToDateTime(fechaFin);
                    if (Request.IsAjaxRequest())
                    {
                        return PartialView("partials/_ListadoReque", Requerimiento.Where(f => f.Fecha_Inicio.Date >= inicio.Date && f.Fecha_Inicio.Date < fin.Date).ToList());
                    }
    
                }

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.

    Willams Morales
    Arequipa - PERÚ

    sábado, 28 de marzo de 2015 3:36
  • hola

    lo que aconsejaria es que no dividas el linq en dos partes, porque la primera estas paginando y en la segunda aplicas el where sobre esa paginacion, lo cual la query resultante puede resultar cualquier cosa

    ademas si desde el principio detectas que no pasa las validaciones, anula desde alli mismo y retorna una respuesta, por supuesto adaptalo a lo que necesites alli puse un null al model pero puedes cambiarlo

    if (fechaIni == "" || fechaFin == "")
    {
    	return PartialView("partials/_ListadoReque", null);
    }
    
    DateTime fin = Convert.ToDateTime(fechaIni).Today;
    DateTime inicio = Convert.ToDateTime(fechaFin).Today;
    
    var Requerimiento = from n in _DB.Requerimiento
    			where n.Fecha_Inicio >= inicio && n.Fecha_Inicio < fin
    			orderby n.ID_Req descending
    			select n).ToPagedList(page, 5);
    				   
    if (Request.IsAjaxRequest())
    {
    	return PartialView("partials/_ListadoReque", Requerimiento);
    }

    cuando convertir a datetime usa el Today para quitar la componente de la hora, a ver si eso esta afectando

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 28 de marzo de 2015 11:37