none
Consultar hora de entrada y salida empleado turno nocturno en sql RRS feed

  • Pregunta

  • Recurro a ustedes en busca de apoyo y sugerencias. Tengo la siguiente tabla en SQL:

    Es el registro de entradas y salidas de empleados que guarda un reloj checador, como verán no es posible diferenciar entradas de salidas ya que todo se inserta como columna. No tengo problema con obtener la hora de entrada y salida de aquellos empleados que NO tienen asignado un turno nocturno, ya que estoy usando un select min y max en el campo hora y agrupando por fecha e ID del empleado. Donde tengo problema es con aquellos empleados que tienen asignado turno nocturno :/ ya que no sé como seleccionar su hora de entrada y salida ya que registra entrada un día (15-12-2017 22:00) y sale al día siguiente (16-12-2017 6:00), inclusive es posible que por error cheque dos veces ya sea entrada y salida, en este caso ocupo de todas formas se visualice hora min y max. Alguna suegerencia de lo que pueda hacer al respecto? Lo que ocupo es obtener una salida así:

    La consulta que tengo actualmente es:

    SELECT MIN(Hora) as HoraEntrada,MAX(Hora)AS HoraSalida,Fecha,IDEmpleado, IdTurno, TurnoNocturno FROM RegistroEmpleados GROUP BY IDEmpleado,Fecha,IdTurno,TurnoNocturno

    Pero el resultado que obtengo es este:

    Agradezco mucho su apoyo, saludos!


    Estoy usando SQL Server 2008 R2.
    • Editado Joan_23 martes, 26 de diciembre de 2017 16:18
    martes, 26 de diciembre de 2017 16:02

Respuestas

  • La única condición para retroceder un día se da cuando el turno es nocturno y la hora de registro es menor a la hora máxima de salida del turno nocturno, que para el ejemplo yo he considerado las 7 horas:

    SELECT r.IDEmpleado, MIN(r.Hora), MAX(r.Hora), r.idTurno, r.TurnoNocturno 
    FROM RegistroEmpleados r 
    GROUP BY 
        r.IDEmpleado, r.idTurno, r.TurnoNocturno, CONVERT(date, IIF(r.TurnoNocturno = 1 AND 
        DATEPART(HOUR, r.Hora) < 7, DATEADD(DAY, -1, r.Hora), r.Hora));
    GO

    martes, 26 de diciembre de 2017 17:31
  • Deleted
    • Propuesto como respuesta Willams Morales martes, 26 de diciembre de 2017 17:17
    • Marcado como respuesta Joan_23 jueves, 28 de diciembre de 2017 19:26
    martes, 26 de diciembre de 2017 16:49

Todas las respuestas

  • Deleted
    • Propuesto como respuesta Willams Morales martes, 26 de diciembre de 2017 17:17
    • Marcado como respuesta Joan_23 jueves, 28 de diciembre de 2017 19:26
    martes, 26 de diciembre de 2017 16:49
  • La única condición para retroceder un día se da cuando el turno es nocturno y la hora de registro es menor a la hora máxima de salida del turno nocturno, que para el ejemplo yo he considerado las 7 horas:

    SELECT r.IDEmpleado, MIN(r.Hora), MAX(r.Hora), r.idTurno, r.TurnoNocturno 
    FROM RegistroEmpleados r 
    GROUP BY 
        r.IDEmpleado, r.idTurno, r.TurnoNocturno, CONVERT(date, IIF(r.TurnoNocturno = 1 AND 
        DATEPART(HOUR, r.Hora) < 7, DATEADD(DAY, -1, r.Hora), r.Hora));
    GO

    martes, 26 de diciembre de 2017 17:31
  • Gracias José Diz, apliqué tu sugerencia y me sirvió para llegar al resultado deseado.

    Saludos!

    jueves, 28 de diciembre de 2017 19:27
  • Gracias por tu respuesta Willams, no puede aplicar tu sugerencia :( me marca error de sintaxis en CONVERT y no pude solucionarlo.
    jueves, 28 de diciembre de 2017 19:28