Determinar tiempo laborado agrupado con una consulta

Tengo las siguientes tablas:

Tabla de empleados

Tabla registro de fecha y tiempos por empleado

Me piden elaborar una consulta en Access para sumar el tiempo y días laborados por empleado en el mes de abril del año 2022, es decir, lo que resalto en amarillo. La idea es obtener algo como este formato que he elaborado en Excel.

2 Respuestas

Respuesta

De esta forma se hace el proceso sobre la misma información para no presentar imágenes que no van al caso y lo mismo con teoría sin fundamento. Aparentemente la pregunta parece fácil, pero requiere de funciones.

Para hacer la consulta se hace por agrupación, pero se requieren de 2 funciones:

TiempoDuracion()

Calcula el tiempo por cada día. Utilizo la función Suma() para sumar los diferentes tiempos. El resultado de esta suma se convierte en horas y minutos con la función.

Tiempoencadena()

DISEÑO DE LA CONSULTA

Observe como selecciono el año y el mes con base en el campo FechaTrabajo, ya usted puede cambiar los parámetros a su gusto. La parte clave está en la Expresión:

TiempoTotal: tiempoencadena(Suma(TiempoDuracion([horainicio];[horafinaliza])))

Y es donde utilizo las 2 funciones.

RESULTADO DE LA CONSULTA

FUNCIONES

Public Function TiempoDuracion(dtmFrom As Date, dtmTo As Date) As Date
    ' Devuelve la duración entre dos valores de fecha/hora
    ' como un valor de fecha/hora
    ' Si los valores de tiempo que se pasan a la función
 ' si tiempo 'desde' es posterior al tiempo 'hasta', se supone que
 ' esto se relaciona con un 'turno' que abarca la medianoche y un día
 ' por lo tanto, se resta del tiempo 'desde'
    ' restar un día de la hora 'desde' si es posterior a la hora 'hasta'
    If dtmTo < dtmFrom Then
        If Int(dtmFrom) + Int(dtmTo) = 0 Then
            dtmFrom = dtmFrom - 1
        End If
    End If
    ' obtener la duración como tipo de datos de fecha y hora
    TiempoDuracion = dtmTo - dtmFrom
End Function
Public Function tiempoencadena(Interval As Double) As String
 ' Función convertir en cadena el total del tiempo
    tiempoencadena = DateDiff("h", 0, Interval) & _
                   Format$(Interval, ":nn")
End Function

Debe copiar las funciones en un módulo. A su correo le envié el ejemplo, no obstante, pueda que alguien más presente otra alternativa.

¡Gracias!  Eduardo exactamente no que necesito, como siempre a tiempo y preciso. Excelente las funciones me sirven para darles uso en otras consultas.

Martha gracias por el reconocimiento y no se complique con consultas SQL que no llevan a nada, pasan la consulta que le suministré a SQL y la maquillan, como quien dice COPIAN.

Enrique siga deje su ignorancia porque no aprende, seguro que lo puedo llevar de la mano, ya ve como le responden, Aprenda y deje la arrogancia

Respuesta

Una consulta para obtener los datos:

SELECT idempleado, Count(FechaTrabajo) AS Dias, Sum(DateDiff("n",[fechatrabajo]+[horainicio],[fechatrabajo]+[horafinaliza]-([horainicio]>[horafinaliza]))) AS minutos FROM Empleados_Tareas WHERE Format([fechatrabajo],"mmyyyy")="042022" GROUP BY idempleado;

Otra para añadir los datos complementarios (y colorearla algo)

SELECT Empleados.idempleado, [Apellido] & ", " & [Nombre] AS Trabajador FROM Empleados;

Se pueden juntar en una sola (y se pueden borrar las de muestra) para obtener el resultado:

SELECT Empleados.idempleado, [Apellido] & ", " & [Nombre] AS Trabajador, [minutos]\60 & Format([minutos] Mod 60,"\:00") AS Tiempo, Dias
FROM Empleados INNER JOIN (SELECT idempleado, Count(FechaTrabajo) AS T_Dias, Sum(DateDiff("n",[fechatrabajo]+[horainicio],[fechatrabajo]+[horafinaliza]-([horainicio]>[horafinaliza]))) AS minutos FROM Empleados_Tareas WHERE Format([fechatrabajo],"mmyyyy")="042022" GROUP BY idempleado)  AS ZZ ON Empleados.idempleado = ZZ.idempleado;

Eduardo:

Sigues en 'el camino a ninguna parte' (lo lamento por ti).

Enrique, personalmente pienso que debe aceptar que el experto Eduardo está muy por encima de lo poco que usted sabe, Acéptelo con humildad toda vez que él lo supera en sus respuestas, que por cierto son muy deficientes. Tómelo con mucha humildad.

Martha Téllez, con toda la humildad del mundo:

Acepto que es más fácil entender a los que están más próximos en conocimientos.

Pero para juzgar los conocimientos ajenos hay que estar por encima de ellos (en conocimientos) y con la misma humildad, acepte que no se dan las circunstancias.

Recoja de lo que le ofrecen lo que considere adecuado y disfrútelo.

Si eso es lo que he hecho tomar las mejores respuestas y este caso me han servido las del experto Eduardo y sencillamente sus respuestas son confusas y demuestran que le falta más conocimiento, ahora, mirando las demás respuestas que se han dado en este foro veo que han valorado mejor las respuestas de los expertos Eduardo y Julián, por eso le recomiendo tómelo con humildad y demuestre lo contrario.

No vale la pena seguir, acabo de ver como resuelve (ni lo había ojeado) y mi solución y la que ha considerado que le era más asumible se parecen como un árbol y un helicóptero.
Por cierto (y solo por tener una referencia): guarde una imagen de esas valoraciones y consúltela dentro de un par de semanas para apreciar las diferencias (seguramente se verá igual, lleva un mes sin variar).

Y aquí finaliza mi intervención en este hilo, no tiene sentido y si desea poner el colofón final (y solo a título de curiosidad): ¿Ha copiado mi respuesta en una consulta virgen y la ha ejecutado? (Independiente de que la sepa analizar o no)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas