Duda con SQL server y tiempos de trabajo en un control de asistencia

Buenas.

Tengo un problema en el trabajo que me está costando mas de la cuenta resolver.

Tengo una tabla en sql server en la cual se registra un time de la hora a la que ha entrado el empleado y otro a la hora la que ha salido.

Yo necesito sacar la diferencia en hh:mm:ss entre estos dos para hallar las horas de trabajo que ha hecho, hasta ahí bien, eso lo tengo, pero el problema es que entre medias puede haber salido al descanso, media hora, esa media hora no la puedo contar como hora de trabajo y no se como sacar esto.

Por otro lado hay ciertos errores como que el empleado entre sin fichar 1 vez, pero fiche al salir 2 veces

La tabla a grandes rasgos consta de:

ID_Emplead-Hora-Fecha-Tipo_De_entrada(entrada o salida)

Alguien sabe como resolver algo así? Estoy falto de ideas [snif]

Saludos!
Pero si hace un descanso se ficha salida y entrada? más que nada porque si los datos no están, pues nada se puede hacer. Pero una vez que tienes los datos, pues cuestión de programarlo.
Si necesitar hacerlo dentro de SQL y no en un lenguaje de programación externo a SQL y lo que quieres hacer es muy complejo para una consulta, siempre podrías usar procedimientos de SQL.

Y ante errores humanos como no fichar al entrar, poco se puede hacer... puedes crear una alarma para detectar anomalias y luego corregirlas a mano en todo caso o simplemente darle un toque a los empleados que se no fichen adecuadamente...
Los errores es lo de menos, si consiguiese saber el tiempo que han estado dentro de la empresa en sí, sin contar descansos etc me valdría.

Todo esto luego lo estoy pasando a una web aspx con vb.

El objetivo es llenar un Gridview con devexpress para luego exportar un Excel con reportes por fechas de días completos.

Y en teoría si, si hace un descenso ficha salida y entrada.
Por cada día, la primera entrada y la última salida de cada empleado es su jornada laboral (corrígeme si no es así). Lo que necesitamos es coger la pareja de filas salida-entrada que se encuentran dentro de esa jornada laboral (que corresponderían al descanso), sacar el tiempo entre una y otra y restárselo al tiempo de la jornada laboral.

Por si no me he explicado muy bien, supongamos que cada linea es un registro de tu tabla. Sería lo que deja un empleado en un día:

EntradaJornada 8:00
SalidaDescanso 14:00
EntradaDescanso 14:30
SalidaJornada 17:00

En la consulta de cada día, para cada empleado buscas los dos registros centrales (los que estén entre el tiempo de la primera entrada y el tiempo de la última salida) que te indican el tiempo de descanso y lo restas al tiempo que te dan los dos registros exteriores (los que te marcan la jornada laboral). Para el tema de fichar dos veces ya habría que poner más controles, pero creo que de esta forma puedes sacarlo con un procedure sencillito.
Si las entradas y salidas son el mismo dia, y te conformas con contar el tiempo entre el primer fichaje del dia y el ultimo, te dejo la consulta como funcionaría en mysql, no se si en SQL Server funcionará.

SELECT
    ID_Emplead,
    fecha,
    TIMEDIFF( MAX(hora), MIN(hora) ) AS jornada 
  FROM `tabla`
  GROUP BY fecha, ID_Emplead
  ORDER BY fecha, ID_Emplead
WaterDark escribió:Si las entradas y salidas son el mismo dia, y te conformas con contar el tiempo entre el primer fichaje del dia y el ultimo, te dejo la consulta como funcionaría en mysql, no se si en SQL Server funcionará.

SELECT
    ID_Emplead,
    fecha,
    TIMEDIFF( MAX(hora), MIN(hora) ) AS jornada 
  FROM `tabla`
  GROUP BY fecha, ID_Emplead
  ORDER BY fecha, ID_Emplead


Lamentablemente no era tan sencillo como esto ya que si realizas es consulta no te va dar nada por cada día te daría todo el rato la misma hora. Si entras a las 10:00 se crea un registro y el minimo y maximo de las 10:00 son las 10:00.

Finalmente y después de unas cuantas tablas temporales para organizar todo hice algo así como lo siguiente:
SELECT

min(t1.hora) as HoraEntrada,
(select min(t2.hora) from tabla as t2 where t2.IdEmpleado=t1.IdEmpleado and t2.Fecha=t1.fecha where t2.tipo_entrada='SALIDA' and t2.hora>t1.hora) as HoraSalida

FROM tabla as t1

where  t1.tipo_entrada='ENTRADA'



Y al resultado de esto para evitar los errores en cálculos en caso de que alguien haya entrado por ejemplo 2 veces y salido solo una, a esta consulta, le hago otra cogiendo la mina fecha de entrada y agrupando por las salidas.

El montaje entero fue bastante mas complejo pero finalmente ahí está la idea jeje

Saludos y gracias por vuestra ayuda!
5 respuestas