Restar campos de hora en access

Tengo dos campos de hora mi problema es si la fecha fin es mayor a la fecha inicio

Ejemplo 1

HoraInicio = 19:30

HoraFin = 03:30

Horas trabajadas = 16 (no esta bien)

Necesito las horas trabajadas

Ejemplo 2

HoraInicio = 07:30

HoraFin = 03:30

Horas trabajadas = 9 (esta bien)

Necesito las horas trabajadas

Estoy usando la funcion Int([HoraLlegada]-[HoraSalida])

Alguien me puede ayudar por favor

3 respuestas

Respuesta
1

no se como ponerlo en el campo horas trabajadas

Si quiere avíeme su base de datos con información ficticia y le hago los ajustes a [email protected] favor en el asunto anotar su consulta.

Tenga presente como se define el formato de la hora, es mejor trabajar con hora militar, veo en su pregunta:

HoraInicio = 07:30

HoraFin = 03:30

Horas trabajadas = 9 (esta bien) ----- NO ES CORRECTO

Son 8 HORAS .

Copie estas funciones en un módulo

Public Function convhora(lnminutos As Long) As String
   Dim Horas As Long
   If lnminutos >= 60 Then
     Horas = lnminutos / 60
    lnminutos = lnminutos - (Horas * 60)
   If Horas >= 1 Then
      convhora = Trim(Str(Horas)) & " horas " & Trim(Str(Abs(lnminutos))) & " minutos"
   End If
Else
convhora = Trim(Str(Abs(lnminutos))) & " minutos"
End If
End Function
Public Function difminutos(tiempoinicial As Date, tiempofinal As Date) As Long
Dim diferencia As Date
If tiempofinal < tiempoinicial Then
tiempofinal = tiempofinal + 1
End If
diferencia = tiempofinal - tiempoinicial
difminutos = Int(CSng(diferencia * 24 * 60))
End Function

Cambie el contenido del generador de expresiones por:

=convhora(difminutos(HoraLlegada,HoraSlida))

No olvide la 3:30 p.m. en hora militar son las 15:30

Si quiere le dejo otra función más practica para calcular tiempo

Public Function difhora(hinicio As Date, hfinal As Date) As Variant
 Dim horainicio As Double
 Dim horafinal As Double
  horainicio = CDbl(hinicio)
  horafinal = CDbl(hfinal)
  If horafinal < horainicio Then
    horafinal = horafinal + 1
  End If
  difhora = Format(CDate(horafinal - horainicio), "hh:mm")
 End Function

Y cambie la expresión por:

=difhora(HoraLlegada,HoraSalida)

Puede probarla en la ventana de inmediato, por ejemplo:

?difhora(#17:40#,#3:30#)
09:50

Respuesta
1

Para hacerle creer a Access que es 'el día siguiente' hay que añadirle 24 horas (un día = 1 unidad)
La regla a aplicar es que si la hora de entrada es superior a la de salida ... sale mañana (no hoy)

= Hora_Salida +ABS(Hora_Salida < Hora_Entrada) - Hora_Entrada

ABS --> Retorna el valor absoluto (siempre será positivo)
Si hora_salida < hora_entrada  = Verdadero (-1)
Si hora_salida > hora_entrada  = Falso (0)

Más simple, las comparaciones devuelven un valor Booleano, que en el caso de Access (que no utiliza un BIT) es por defecto para True (-1) y False (0)

= Hora_Salida - (Hora_Salida < Hora_Entrada) - Hora_Entrada

Si se cumple TRUE (-1)  se restara el valor que al ser negativo se sumara
Si no se cumple FALSE (0) no influencia el resultado
Nota adicional:
Los días son unidades
Las horas fracciones del día (una hora  = 1/24, cinco horas = 5/24.... ) y es valido para minutos,  (un minuto = 1/1440   ..... un segundo =  1/86400 ..... )

Respuesta
1

Las horas que ves como 09:30 realmente no existen, su valor es un decimal de 1, son decimales de día, por tanto puedes usar

If horasalida<horaentrada then

horastrabajadas=horasalida+1 -horaentrada

else

horastrabajadas=horasalida-hora entrada

end if

Es decir, lo que hace es que si el decimal que representa la hora de salida, por ejemplo, 0,345678 es menor que el decimal que representa la hora de entrada, por ejemplo, 0,765437, lo que hace es sumarle un 1 y sería

1,345678 - 0765437 y te da la horas correctas.

A la hora en que escribo esto, las 00:07, su valor real es el que ves a su derecha

En lo de abajo, puedes ver que la hora de salida es menor, en decimal, que la de entrada por eso, en el evento Después de actualizar del cuadro de texto Horasalida le pongo la instrucción que cité más arriba.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas