Puede hacerlo de 2 formas, con SQL o con VBA.
Supongamos que tu tabla se llama Registros y tiene estos campos:
EmpleadoID
HoraInicio → (ej. 01/04/2025 06:00:00)
HoraFin → (ej. 01/04/2025 13:30:00)
HorasExtra (que puede ser calculado o almacenado según cómo lo necesite)
Con SQL
SELECT
EmpleadoID,
HoraInicio,
HoraFin,
IIf(Hour(HoraInicio) < 8,
DateDiff("n", HoraInicio, IIf(HoraFin < #08:00:00#, HoraFin, #08:00:00#)),
0) +
IIf(Hour(HoraFin) >= 18,
DateDiff("n", IIf(HoraInicio > #18:00:00#, HoraInicio, #18:00:00#), HoraFin),
0)
AS MinutosExtra,
Round(([MinutosExtra] / 60), 2) AS HorasExtra
FROM Registros;
Esta consulta calcula los minutos trabajados fuera del horario (antes de las 08:00 o después de las 18:00), y luego lo convierte a horas.
Con VBA
Usar VBA para calcular y guardar en el campo HorasExtra
Dim hInicio As Date, hFin As Date
Dim hEntrada As Date, hSalida As Date
Dim minutosExtra As Long
hInicio = Me.HoraInicio
hFin = Me.HoraFin
hEntrada = DateValue(hInicio) + TimeValue("08:00:00")
hSalida = DateValue(hFin) + TimeValue("18:00:00")
minutosExtra = 0
If hInicio < hEntrada Then
minutosExtra = minutosExtra + DateDiff("n", hInicio, IIf(hFin < hEntrada, hFin, hEntrada))
End If
If hFin > hSalida Then
minutosExtra = minutosExtra + DateDiff("n", IIf(hInicio > hSalida, hInicio, hSalida), hFin)
End If
Me.HorasExtra = Round(minutosExtra / 60, 2)
¿Qué pasa si el rango está completamente fuera del horario?
Este código maneja todos los casos:
Si toda la jornada está fuera del horario → suma todo.
Si está parcialmente fuera → suma solo las diferencias.
Si está dentro del horario laboral → HorasExtra = 0.