none
LISTA DE FECHAS EN UN RANGO DE FECHAS RRS feed

  • Pregunta

  • HOLA A TODOS, 

    tengo dos tablas CRONOGRAMA y REGISTROES, en la primera esta el HORARIO (DNI, FECHA, HORAINICIO,HORAFIN) de los usuarios y en la segunda esta los datos de su REGISTRO diario (DNI,FECHA, HORA,TIPO), con una consulta pude sacar los usuarios que se registraron en un rango de fechas:

    select distinct r.dni, r.fecha
    from Cronograma c
    inner join RegistroES r
    on c.dni=r.dni
    where r.fecha between '2019-09-20' and '2019-09-21'
    order by r.fecha

    el resultado es: USUARIOS QUE SI SE REGISTRARON

    dni |  fecha
    ----|---------
    4   |  2019-09-20
    5   |  2019-09-20
    6   |  2019-09-20
    1   |  2019-09-21
    4   |  2019-09-21
    5   |  2019-09-21
    6   |  2019-09-21

    pero lo que yo necesito, es saber quienes NO SE REGISTRARON y en que fechas en ese rango y que esten ordenados por fecha. Espero me ayuden gracias. La tabla CRONOGRAMA tambien tiene el campo "fecha", el cual verifica si en esa fecha se registro.

    Yo necesito saber los que no se registraron en ese rango de fechas y en que fechas.

    La lista de usuarios y sus horarios estan en la tabla CRONOGRAMA

    por ejemplo esta consulta me arroja el usuario que no se registro pero en una fecha especifica:

    select distinct c.dni
    from Cronograma c
    full outer join RegistroES r
    on c.dni=r.dni
    where c.dni not in (select dni from RegistroES where fecha = '2019-09-21')

    Me arroja este resultado:

    dni |
    ----|
    2   |
    3   |

    como hago para que me arroje en un rango de fechas y en que fechas?

    El resultado que quiero es:

    dni |  fecha
    ----|---------
    1   |  2019-09-20
    2   |  2019-09-20
    3   |  2019-09-20
    2   |  2019-09-21
    3   |  2019-09-21

    domingo, 22 de septiembre de 2019 0:31

Respuestas

  • Hola MarcoRamosZuckerberg:

    Tu escenario

    CREATE TABLE Cronograma
    (dni        INT, 
     fecha      DATE, 
     horaInicio TIME, 
     horaFin    TIME
    );
    CREATE TABLE RegistroEs
    (dni   INT, 
     fecha DATE, 
     hora  TIME, 
     tipo  BIT
    );
    GO
    
    INSERT INTO Cronograma
    (dni, fecha, horaInicio, horaFin)
    VALUES
    (1,'20190919','09:00','15:00'),
    (1,'20190920','09:00','15:00'),
    (1,'20190921','09:00','15:00'),
    (1,'20190922','09:00','15:00'),
    (2,'20190919','09:00','15:00'),
    (2,'20190920','09:00','15:00'),
    (2,'20190921','09:00','15:00'),
    (2,'20190922','09:00','15:00'),
    (3,'20190919','09:00','15:00'),
    (3,'20190920','09:00','15:00'),
    (3,'20190921','09:00','15:00'),
    (3,'20190922','09:00','15:00'),
    (4,'20190919','09:00','15:00'),
    (4,'20190920','09:00','15:00'),
    (4,'20190921','09:00','15:00'),
    (4,'20190922','09:00','15:00'),
    (5,'20190919','09:00','15:00'),
    (5,'20190920','09:00','15:00'),
    (5,'20190921','09:00','15:00'),
    (5,'20190922','09:00','15:00'),
    (6,'20190919','09:00','15:00'),
    (6,'20190920','09:00','15:00'),
    (6,'20190921','09:00','15:00'),
    (6,'20190922','09:00','15:00');
    GO
    INSERT INTO RegistroEs
    (dni, fecha, hora, tipo)
    VALUES
    (1,'20190919','10:00',0),
    (1,'20190919','11:00',1),
    (1,'20190921','10:00',0),
    (1,'20190921','11:00',1),
    (1,'20190922','10:00',0),
    (2,'20190919','10:00',0),
    (2,'20190922','10:00',0),
    (2,'20190922','15:00',1),
    (4,'20190919','10:00',0),
    (4,'20190919','11:00',1),
    (4,'20190920','10:00',0),
    (4,'20190920','11:00',1),
    (4,'20190921','10:00',0),
    (4,'20190921','11:00',1),
    (4,'20190922','10:00',0),
    (4,'20190922','16:00',1),
    (5,'20190919','10:00',0),
    (5,'20190919','11:00',1),
    (5,'20190920','10:00',0),
    (5,'20190920','11:00',1),
    (5,'20190921','10:00',0),
    (5,'20190921','11:00',1),
    (5,'20190922','10:00',0),
    (5,'20190922','16:00',1),
    (6,'20190919','10:00',0),
    (6,'20190919','11:00',1),
    (6,'20190920','10:00',0),
    (6,'20190920','11:00',1),
    (6,'20190921','10:00',0),
    (6,'20190921','11:00',1),
    (6,'20190922','10:00',0),
    (6,'20190922','16:00',1);
    GO

    Una posible solución.

    DECLARE @FECHAINICIO DATE= '20190920';
    DECLARE @FECHAFIN DATE= '20190921';
    WITH CTE
         AS (
    		 SELECT C.fecha, C.DNI
    		 FROM Cronograma C
    		 WHERE C.fecha BETWEEN @FECHAINICIO AND @FECHAFIN
    	   ), REG AS
    	   (
    		  SELECT  C.FECHA AS FechaRequerida, C.dni AS DNIREQUERIDO, R.DNI, R.fecha
    		  FROM  CTE C LEFT JOIN RegistroEs R ON C.FECHA= R.fecha AND C.DNI =R.dni
    		  GROUP BY R.DNI, R.fecha, C.FECHA , C.dni
    	   )
    	   SELECT R.DNIREQUERIDO AS dni, R.FechaRequerida AS fecha
    	   FROM REG R
    	   WHERE DNI IS NULL
    	   ORDER BY FechaRequerida 

    Salida

    dni         fecha
    ----------- ----------
    1           2019-09-20
    2           2019-09-20
    3           2019-09-20
    2           2019-09-21
    3           2019-09-21

    https://javifer2.wordpress.com/2019/09/16/combinaciones-entre-tablas-inner-left-right-full/

    domingo, 22 de septiembre de 2019 3:50

Todas las respuestas

  • Hola MarcoRamosZuckerberg:

    Tu escenario

    CREATE TABLE Cronograma
    (dni        INT, 
     fecha      DATE, 
     horaInicio TIME, 
     horaFin    TIME
    );
    CREATE TABLE RegistroEs
    (dni   INT, 
     fecha DATE, 
     hora  TIME, 
     tipo  BIT
    );
    GO
    
    INSERT INTO Cronograma
    (dni, fecha, horaInicio, horaFin)
    VALUES
    (1,'20190919','09:00','15:00'),
    (1,'20190920','09:00','15:00'),
    (1,'20190921','09:00','15:00'),
    (1,'20190922','09:00','15:00'),
    (2,'20190919','09:00','15:00'),
    (2,'20190920','09:00','15:00'),
    (2,'20190921','09:00','15:00'),
    (2,'20190922','09:00','15:00'),
    (3,'20190919','09:00','15:00'),
    (3,'20190920','09:00','15:00'),
    (3,'20190921','09:00','15:00'),
    (3,'20190922','09:00','15:00'),
    (4,'20190919','09:00','15:00'),
    (4,'20190920','09:00','15:00'),
    (4,'20190921','09:00','15:00'),
    (4,'20190922','09:00','15:00'),
    (5,'20190919','09:00','15:00'),
    (5,'20190920','09:00','15:00'),
    (5,'20190921','09:00','15:00'),
    (5,'20190922','09:00','15:00'),
    (6,'20190919','09:00','15:00'),
    (6,'20190920','09:00','15:00'),
    (6,'20190921','09:00','15:00'),
    (6,'20190922','09:00','15:00');
    GO
    INSERT INTO RegistroEs
    (dni, fecha, hora, tipo)
    VALUES
    (1,'20190919','10:00',0),
    (1,'20190919','11:00',1),
    (1,'20190921','10:00',0),
    (1,'20190921','11:00',1),
    (1,'20190922','10:00',0),
    (2,'20190919','10:00',0),
    (2,'20190922','10:00',0),
    (2,'20190922','15:00',1),
    (4,'20190919','10:00',0),
    (4,'20190919','11:00',1),
    (4,'20190920','10:00',0),
    (4,'20190920','11:00',1),
    (4,'20190921','10:00',0),
    (4,'20190921','11:00',1),
    (4,'20190922','10:00',0),
    (4,'20190922','16:00',1),
    (5,'20190919','10:00',0),
    (5,'20190919','11:00',1),
    (5,'20190920','10:00',0),
    (5,'20190920','11:00',1),
    (5,'20190921','10:00',0),
    (5,'20190921','11:00',1),
    (5,'20190922','10:00',0),
    (5,'20190922','16:00',1),
    (6,'20190919','10:00',0),
    (6,'20190919','11:00',1),
    (6,'20190920','10:00',0),
    (6,'20190920','11:00',1),
    (6,'20190921','10:00',0),
    (6,'20190921','11:00',1),
    (6,'20190922','10:00',0),
    (6,'20190922','16:00',1);
    GO

    Una posible solución.

    DECLARE @FECHAINICIO DATE= '20190920';
    DECLARE @FECHAFIN DATE= '20190921';
    WITH CTE
         AS (
    		 SELECT C.fecha, C.DNI
    		 FROM Cronograma C
    		 WHERE C.fecha BETWEEN @FECHAINICIO AND @FECHAFIN
    	   ), REG AS
    	   (
    		  SELECT  C.FECHA AS FechaRequerida, C.dni AS DNIREQUERIDO, R.DNI, R.fecha
    		  FROM  CTE C LEFT JOIN RegistroEs R ON C.FECHA= R.fecha AND C.DNI =R.dni
    		  GROUP BY R.DNI, R.fecha, C.FECHA , C.dni
    	   )
    	   SELECT R.DNIREQUERIDO AS dni, R.FechaRequerida AS fecha
    	   FROM REG R
    	   WHERE DNI IS NULL
    	   ORDER BY FechaRequerida 

    Salida

    dni         fecha
    ----------- ----------
    1           2019-09-20
    2           2019-09-20
    3           2019-09-20
    2           2019-09-21
    3           2019-09-21

    https://javifer2.wordpress.com/2019/09/16/combinaciones-entre-tablas-inner-left-right-full/

    domingo, 22 de septiembre de 2019 3:50
  • Hola MarcosRamosZuckergerg:

    Si ya has visto la anterior entrada, realmente solo tienes  que hacer un left join y coger los registros que en su tabla sean null.

    DECLARE @FECHAINICIO DATE= '20190920';
    DECLARE @FECHAFIN DATE= '20190921';
    
    SELECT  C.dni, C.FECHA
      FROM  cronograma C LEFT JOIN RegistroEs R ON C.FECHA= R.fecha AND C.DNI =R.dni
    	  WHERE R.DNI IS NULL
    	   	  AND C.FECHA BETWEEN @FECHAINICIO AND @FECHAFIN
    	 
     ORDER BY C.fecha, c.dni

    domingo, 22 de septiembre de 2019 4:01
  • Si me funciono, muchas  gracias, pero como podria hacer un conteo de cuantas veces no se a registrado un personal? en ese mismo rango de fechas
    domingo, 22 de septiembre de 2019 4:45
  • Hola:

    Una opción

    DECLARE @FECHAINICIO DATE= '20190920';
    DECLARE @FECHAFIN DATE= '20190921';
    SELECT C.dni, 
           COUNT(*) as AusenciasEnRango
    FROM cronograma C
         LEFT JOIN RegistroEs R ON C.FECHA = R.fecha
                                   AND C.DNI = R.dni
    WHERE R.DNI IS NULL
          AND C.FECHA BETWEEN @FECHAINICIO AND @FECHAFIN
    GROUP BY c.dni
    ORDER BY AusenciasEnRango desc, dni;

    domingo, 22 de septiembre de 2019 5:21