none
Consultar rango de fechas mediante el campo DateTime. RRS feed

  • Pregunta

  • Hola a todos!!

    Tengo un problema al consultar los registros mediante un rango de fechas, no me muestra nada al determinar el rango. Quisiera saber como podria modificar mi procedimiento almacenado para que me muestre los registros.

    utilizo dos Textbox

    El procedimiento es el siguiente:

    CREATE PROCEDURE registrosHrEyHrS
    @fechaInicio DATE,
    @fechaFin    DATE
    as
    BEGIN
    SELECT id_Reg as 'ID',fechayHrE as 'Fecha y Hr de Entrada',fechayHrS as 'Fecha y Hr de Salida', deptoNum as 'Depto y No. Equipo', nombre as 'Nombre del responsable', apellidoP as 'Apellido'  
    FROM Registro_EyS r
    INNER JOIN Equipo e ON r.id_rfid = e.id_rfid 
    INNER JOIN Personal p ON p.id_numControl = e.id_numControl
    WHERE @fechaFin  >= r.fechayHrE
       and @fechaInicio <= r.fechayHrS
    END
    Porfavor necesito su ayuda.


    • Editado Dhaniel..M lunes, 11 de junio de 2018 19:45
    lunes, 11 de junio de 2018 19:40

Respuestas

  • Hola:

    A lo mejor el problema no esta del lado del Sql, sino del lado de como llamas al procedimiento, o mejor dicho que valores le llegan al procedimiento, pues el sql sabe castear implicitamente datetime a date y del reves. La relación de las tablas a priori esta bien formada, y evidentemente los datos, solo los puedes ver tu.

    create table pr (id int identity(1,1), fechad datetime, fechah datetime)
    go
    insert into pr (fechad, fechah) values ('20180101', '20180102 23:59:59.997'),
    ('20180101 15:15:45.000', '20180102 22:00:59.997'),
    ('20180401 16:12:14.000', '20180402 23:59:59.997'),
    ('20180501 19:00:00.000', '20180502')
    go
    select * from pr;
    /* a los efectos da igual que yo le pase un date o un datetime, que el construye implicitamente un datetime*/
    select * from pr where fechad > '20180401'
    go
    
    

    Para saber seguro si esta del lado del paso de parametros, del lado de la relación o del lado del codigo c#

    Puedes hacer algo muy simple

    CREATE TABLE PRUEBA (ID INT IDENTITY(1,1), FECHAD DATETIME, FECHAH DATETIME,ACTUALIZACION DATETIME)
    GO
    
    
    ALTER PROCEDURE registrosHrEyHrS
    @fechaInicio DATETIME,
    @fechaFin    DATETIME
    as
    BEGIN
    /* VALIDAS LUEGO LO QUE ENTRA DE VERDAD */
    INSERT INTO PRUEBA (FECHAD, FECHAH, ACTUALIZACION) VALUES (@fechaInicio , @fechaFin , GETDAte();
    
    SELECT id_Reg as 'ID',fechayHrE as 'Fecha y Hr de Entrada',fechayHrS as 'Fecha y Hr de Salida', deptoNum as 'Depto y No. Equipo', nombre as 'Nombre del responsable', apellidoP as 'Apellido'  
    FROM Registro_EyS r
    INNER JOIN Equipo e ON r.id_rfid = e.id_rfid 
    INNER JOIN Personal p ON p.id_numControl = e.id_numControl
    WHERE @fechaInicio  <= r.fechayHrE
       and @fechaFin >= r.fechayHrS
    END

    Ejecutas el procedure despues de haber creado la tabla, y le haces una select, para saber si llega lo que tiene que llegar en formato que tiene que llegar. Dos Datetime. O Dos Date, que se lo come igual. O dos string aquí ya entra en juego la notación de fechas en base a Culture...etc

    SI te ha insertado en pruebas, ya sabes que los parametros llegan. Entonces, el problema es de la relación.

    Haz la select quitando el where.

    Si no te ha insertado en pruebas, tendrás que pegar el código c#

    Un saludo

    miércoles, 13 de junio de 2018 16:56

Todas las respuestas

  • Pues normalmente cuando se habla de rangos (tuve alguna vez un profesor en Ingeniería Química que decía que la palabra correcta era ámbito, no rango; no recuerdo por qué) normalmente la fecha a comparar es la misma.  En su PA veo que para comparar con el límite superior utiliza fechayHrE, pero para límite superior es fechayHrS.  Entonces su cláusula WHERE no significa "que una fecha esté en un rango de fechas".  Tal vez por ahí anda su problema.

    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    lunes, 11 de junio de 2018 19:53
    Moderador
  • Hola. A parte de lo comentado por webJose, yo el probaría cambiar así la condición
    WHERE @fechaInicio  >= r.fechayHrE
       and @fechaFin <= r.fechayHrS

    Cambia el orden de los parámetros

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

    martes, 12 de junio de 2018 6:33
    Moderador
  • No muestra nada, hice las modificaciones y nada.

    Sera por el tipo de dato que utilizo o necesito convertir de datetime a date?

    martes, 12 de junio de 2018 14:28
  • El tipo de dato DATETIME tiene en cuenta la parte horaria del mismo. Si tu campo en la tabla es de tipo DATETIME, el parámetro a usar debe ser del mismo tipo

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

    martes, 12 de junio de 2018 14:44
    Moderador
  • Quizas tu inconveniente sea que el campo en el que estas buscando sea datetime y tus variables sean date; tambien puedo ver que las condiciones no estan bien. Pruébale de este modo:
    SELECT id_Reg as 'ID',fechayHrE as 'Fecha y Hr de Entrada',fechayHrS as 'Fecha y Hr de Salida', deptoNum as 'Depto y No. Equipo', nombre as 'Nombre del responsable', apellidoP as 'Apellido'  
    FROM Registro_EyS r
    INNER JOIN Equipo e ON r.id_rfid = e.id_rfid 
    INNER JOIN Personal p ON p.id_numControl = e.id_numControl
    WHERE @fechaFin  <= convert(date,r.fechayHrE)
       and @fechaInicio >= convert(date,r.fechayHrS)

    Espero que te sirva


    Vladimir Miranda Desarrollador Jr.

    martes, 12 de junio de 2018 22:18
  • Ya realice las modificaciones y no me muestra nada.

    Lo modifique de la siguiente manera:

    ALTER PROCEDURE registrosHrEyHrS
    @fechaInicio DATETIME,
    @fechaFin    DATETIME
    as
    BEGIN
    SELECT id_Reg as 'ID',fechayHrE as 'Fecha y Hr de Entrada',fechayHrS as 'Fecha y Hr de Salida', deptoNum as 'Depto y No. Equipo', nombre as 'Nombre del responsable', apellidoP as 'Apellido'  
    FROM Registro_EyS r
    INNER JOIN Equipo e ON r.id_rfid = e.id_rfid 
    INNER JOIN Personal p ON p.id_numControl = e.id_numControl
    WHERE @fechaFin  <= convert(date,r.fechayHrE)
       and @fechaInicio >= convert(date,r.fechayHrS)
    END

    miércoles, 13 de junio de 2018 16:25
  • Prueba con esta modificación por favor; debería funcionar.

    ALTER PROCEDURE registrosHrEyHrS @fechaInicio DATETIME, @fechaFin DATETIME as BEGIN SELECT id_Reg as 'ID',fechayHrE as 'Fecha y Hr de Entrada',fechayHrS as 'Fecha y Hr de Salida', deptoNum as 'Depto y No. Equipo', nombre as 'Nombre del responsable', apellidoP as 'Apellido' FROM Registro_EyS r INNER JOIN Equipo e ON r.id_rfid = e.id_rfid INNER JOIN Personal p ON p.id_numControl = e.id_numControl WHERE @fechaInicio <= convert(date,r.fechayHrE) and @fechaFin >= convert(date,r.fechayHrS) END

    Si aun no funciona la consulta prueba a qutar los inner join por un left join:

    ALTER PROCEDURE registrosHrEyHrS @fechaInicio DATETIME, @fechaFin DATETIME as BEGIN SELECT id_Reg as 'ID',fechayHrE as 'Fecha y Hr de Entrada',fechayHrS as 'Fecha y Hr de Salida', deptoNum as 'Depto y No. Equipo', nombre as 'Nombre del responsable', apellidoP as 'Apellido' FROM Registro_EyS r LEFT OUTER JOIN Equipo e ON r.id_rfid = e.id_rfid LEFT OUTER JOIN Personal p ON p.id_numControl = e.id_numControl WHERE @fechaInicio <= convert(date,r.fechayHrE) and @fechaFin >= convert(date,r.fechayHrS) END

    Espero te sirva de ayuda


    Vladimir Miranda Desarrollador Jr.

    miércoles, 13 de junio de 2018 16:30
  • Hola:

    A lo mejor el problema no esta del lado del Sql, sino del lado de como llamas al procedimiento, o mejor dicho que valores le llegan al procedimiento, pues el sql sabe castear implicitamente datetime a date y del reves. La relación de las tablas a priori esta bien formada, y evidentemente los datos, solo los puedes ver tu.

    create table pr (id int identity(1,1), fechad datetime, fechah datetime)
    go
    insert into pr (fechad, fechah) values ('20180101', '20180102 23:59:59.997'),
    ('20180101 15:15:45.000', '20180102 22:00:59.997'),
    ('20180401 16:12:14.000', '20180402 23:59:59.997'),
    ('20180501 19:00:00.000', '20180502')
    go
    select * from pr;
    /* a los efectos da igual que yo le pase un date o un datetime, que el construye implicitamente un datetime*/
    select * from pr where fechad > '20180401'
    go
    
    

    Para saber seguro si esta del lado del paso de parametros, del lado de la relación o del lado del codigo c#

    Puedes hacer algo muy simple

    CREATE TABLE PRUEBA (ID INT IDENTITY(1,1), FECHAD DATETIME, FECHAH DATETIME,ACTUALIZACION DATETIME)
    GO
    
    
    ALTER PROCEDURE registrosHrEyHrS
    @fechaInicio DATETIME,
    @fechaFin    DATETIME
    as
    BEGIN
    /* VALIDAS LUEGO LO QUE ENTRA DE VERDAD */
    INSERT INTO PRUEBA (FECHAD, FECHAH, ACTUALIZACION) VALUES (@fechaInicio , @fechaFin , GETDAte();
    
    SELECT id_Reg as 'ID',fechayHrE as 'Fecha y Hr de Entrada',fechayHrS as 'Fecha y Hr de Salida', deptoNum as 'Depto y No. Equipo', nombre as 'Nombre del responsable', apellidoP as 'Apellido'  
    FROM Registro_EyS r
    INNER JOIN Equipo e ON r.id_rfid = e.id_rfid 
    INNER JOIN Personal p ON p.id_numControl = e.id_numControl
    WHERE @fechaInicio  <= r.fechayHrE
       and @fechaFin >= r.fechayHrS
    END

    Ejecutas el procedure despues de haber creado la tabla, y le haces una select, para saber si llega lo que tiene que llegar en formato que tiene que llegar. Dos Datetime. O Dos Date, que se lo come igual. O dos string aquí ya entra en juego la notación de fechas en base a Culture...etc

    SI te ha insertado en pruebas, ya sabes que los parametros llegan. Entonces, el problema es de la relación.

    Haz la select quitando el where.

    Si no te ha insertado en pruebas, tendrás que pegar el código c#

    Un saludo

    miércoles, 13 de junio de 2018 16:56