¿Cómo puedo comparar horas y extraer la diferencia?

En una tabla quiero recoger los registros que hacen los empleados, y si las horas no están dentro de su horario laboral, que calcule las horas y los sume en otra campo.

Por ejemplo tengo:

HoraInicio (01/04/2025 6:00:00)

HoraFin (01/04/2025 13:30:00)

y

HorarioIncioMañana (8:00)

HorarioFinMañana (13:00)

En este caso querría un resultado de HorasExtras = 2.5

¿Es Posible?

Respuesta

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.

1 respuesta más de otro experto

Respuesta

Con la función datediff y el parámetro 'n' obtenemos el tiempo en minutos ('n')
Jornada = Datediff("n", HorarioIncioMañana, HorarioFinMañana) ==>> 300 (minutos)

La jornada es una constante, si le restamos al tiempo trabajado (también en minutos) la constante (los 300 minutos) se puede obtener el tiempo en formato decimal o en su formato hora

Formato decimal
Horas_extra = (datediff("n", HoraInicio, HoraFin) - 300 )/60 ==>> 2,5

Formato hora
Horas_extra = datediff("n", HoraInicio, HoraFin) - 300
horas_extra = Horas_extra\60 & Format(horas_extra mod 60, "\:00")

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas