** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Comparar horas de variable fecha
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoComparar horas de variable fecha

 Responder Responder
Autor
Mensaje
pascual14 Ver desplegable
Asiduo
Asiduo


Unido: 30/Junio/2014
Localización: madrid
Estado: Sin conexión
Puntos: 473
Enlace directo a este mensaje Tema: Comparar horas de variable fecha
    Enviado: 13/Septiembre/2019 a las 19:47


Hola amigos, tengo un problema que no sé como solucionar. Tengo una función a la que le paso una hora tipo 30/09/2019 5:00:00 de esa fecha tomo la hora en formato corto y luego la comparo para saber a que turno de trabajo pertenece. Tengo 3 de 6:00 a 14:00 de 14:00 a 22:00 y de 22:00 a 6:00. La cosa es que funciona bien menos con algunas horas, por ejemplo la hora 5:00:00 que no entiende que es el tercer turno y no sé por qué. ¿alguna idea de que hago mal? o es que esto se hace de otra forma? esta es mi función. Gracias.

Private Function CalculaTurno(datFechaHora As Date) As Byte
   Dim datHora As Date, bytTurno As Byte
   
   datHora = Format(datFechaHora, "Short Time"): bytTurno = 0
   If datHora >= #6:00:00 AM# And datHora <= #2:00:00 PM# Then
      bytTurno = 1  ' Primer turno. Mañana
   End If
   If datHora > #2:00:00 PM# And datHora <= #10:00:00 PM# Then
      bytTurno = 2  ' Segundo  turno. Tarde
   End If
   If datHora > #10:00:00 PM# And datHora < #6:00:00 AM# Then
      bytTurno = 3  ' Tercer turno. Noche
   End If
   CalculaTurno = bytTurno
End Function

Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11130
Enlace directo a este mensaje Enviado: 13/Septiembre/2019 a las 20:39
Emplea la función Hour ...

Hora = Hour(datfechaHora)
If Hora > 6 then
     ....
     elseif hora > 14
     .....
     else > 22
     .....
end if


Edito: ... por cierto, por estas cosas yo siempre separo en dos campos fecha y hora ... Wink


Editado por Mihura - 13/Septiembre/2019 a las 20:43
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 5240
Enlace directo a este mensaje Enviado: 13/Septiembre/2019 a las 20:40
Hola!

Es normal que te dé problemas, aquí declaras la hora como corta y luego en las condiciones "If" la pones como hora larga.

lo correcto sería:

datHora = Format(datFechaHora, "Long Time")
Un Saludo.
Arriba
fcoval Ver desplegable
Habitual
Habitual


Unido: 19/Enero/2013
Estado: Sin conexión
Puntos: 134
Enlace directo a este mensaje Enviado: 13/Septiembre/2019 a las 20:58
Justamente esta mañana he tenido que usar algo parecido...

Cita
Function CalculaTurno(datFechaHora As Date) As Byte

   Dim datHora As Variant, bytTurno As Byte
       
   bytTurno = 0
   datHora = Hour(datFechaHora)

   Select Case datHora
   
    Case 6, 7, 8, 9, 10, 11, 12, 13
    bytTurno = 1 ' Primer turno. Mañana
   
    Case 14, 15, 16, 17, 18, 19, 20, 21
    bytTurno = 2 ' Segundo turno. Tarde
   
    Case 22, 23, 0, 1, 2, 3, 4, 5
    bytTurno = 3 ' Tercer turno. Noche
   
   End Select


   CalculaTurno = bytTurno

End Function

---------------------------------
Sub test()
Debug.Print CalculaTurno2(#9/30/2019 5:00:00 AM#)
End Sub

Arriba
emiliove Ver desplegable
Moderador
Moderador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 5015
Enlace directo a este mensaje Enviado: 13/Septiembre/2019 a las 23:04
Otra:

Function CalculaTurno(datFechaHora As Date) As Byte
   Dim datHora As Date, bytTurno As Byte
  
   datHora = Format(datFechaHora, "Short Time") ': bytTurno = 0
     
   If CDbl(datHora) < CDbl(#6:00:00 AM#) Then
      bytTurno = 3  ' Tercer turno. Noche
   ElseIf CDbl(datHora) <= CDbl(#2:00:00 PM#) Then
      bytTurno = 1  ' Primer turno. Ma?ana
   ElseIf CDbl(datHora) <= CDbl(#10:00:00 PM#) Then
      bytTurno = 2  ' Segundo  turno. Tarde
   Else
      bytTurno = 3  ' Tercer turno. Tarde
   End If
   CalculaTurno = bytTurno
End Function



Editado por emiliove - 13/Septiembre/2019 a las 23:05
Arriba
pascual14 Ver desplegable
Asiduo
Asiduo


Unido: 30/Junio/2014
Localización: madrid
Estado: Sin conexión
Puntos: 473
Enlace directo a este mensaje Enviado: 14/Septiembre/2019 a las 09:55
Hola amigos, primero dar las gracias pro la ayuda. Ya he probado esto y me doy cuenta que se me olvidó detallar que a veces tengo que calcular el turno de todas no enteras, pro ejemplo las 14:30, con lo que la función hour no me sirve porque me devuelve 14, me diría que es del tuno de mañana y en realidad es el de tarde. La que si que me ha servido es la función de emiliove. La verdad es que no me ha tocado casi nada trabajar con horas. Gracias de nuevo. Podéis cerrar el hilo.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable