Contar numero de horas según franja horaria

Sé que hay ejemplos parecidos caso Sveinbjorn horas nocturnas por ejemplo, pero busco algo más sencillo que el citado ejemplo http://www.siliconproject.com.ar/neckkito/index.php/aportaciones

Como puedo conocer entre dos campos de horas, entrada y salida, cuantas se han hecho en horario de mañana, horario de tarde o horario de noche.

Para esto definiría una función pública donde limitaría estas franjas.

Lo que quiero conseguir es

Horario mañana 08:00:00 a 15:00:00
Horario Tarde 15:00:01 a 20:00:00
Horario noche 20:00:01 a 07:59:59
Así si la entrada es a las 08:00:00 y sale a las 19:00:00 me arrojaría 07:00:00 horas mañana; 04:00:00 tarde

1 Respuesta

Respuesta
2

¿Registras sólo la hora de entrada y salida o también la fecha? Y en caso de que registres la fecha, ¿lo haces en campos separados o fecha y hora en el mismo?

Es para intentar prepararte un ejemplo.

Vaya sorpresa tu respuesta! Muchas gracias. Sigo tus ejemplos gracias a Neckito y estoy muy picado con tu ejemplo.

Mi estructura de tabla es la siguiente 

Facceso fecha acceso

HAcceso hora de entrada

HSalida hora de salida

Yo el problema que tengo es que una persona entra a las 8 y sale a las 22 por ejemplo y me gustaría que no sólo me arrojase el total sino diferenciado por tramos.

Perdona las molestias, pero no terminé de entender tu ejemplo.

Muchísimas gracias

Voy un poco corto de tiempo, y el ejemplo enreda bastante. Intentaré terminártelo para mañana (llevo 3/4 hecho)

Pues al final lo di terminado hoy, lo que me quedaba era lo más sencillo, je je

Aquí te dejo el enlace al archivo: http://www.filebig.net/files/3xrTUeGjgF 

Creo que funciona correctamente (aunque no le puse controles para verificar los datos introducidos) si le pones datos "normales", pero compruébalo por si hay que retocar algo.

Estimado amigo,

Muchísimas gracias, es justo lo que planteaba.

Hay una parte que no entiendo y que muy desafortunadamente nunca lo habría hecho, te copio la línea que no entiendo y en concreto el 1440

fncHorasNoche = (1440 + DateDiff("n", iniNoche, #12:00:00 AM#) + DateDiff("n", #12:00:00 AM#, laHoraFin)) / 60

Qué indicas con 1440?

Por otro lado, está el dichoso formato. Mis horas son por ejemplo 09:25:52 por lo que me da error tu ejemplo. He probado en poner "h" y quitar /60 pero no sale.

Gracias a Neckkito, usaba esta función, pero no consiguo aplicarla correctamente en tu ejemplo

Public Function TimeToString(Interval As Double) As String
TimeToString = DateDiff("h", 0, Interval) & _
Format$(Interval, ":nn:ss")
End Function

¿cómo lo debo hacer?

Siendo un entrometido, te animaría a publicar tu ejemplo en las aportaciones de Neckkito para ayudar a otros muchos que están como yo.

No dudes en ponerte en contacto conmigo si vienes a Sevilla, las cervezas están garantizadas.

Muchísimas gracias

Te explico la linea:

fncHorasNoche = (1440 + DateDiff("n", iniNoche, #12:00:00 AM#) + DateDiff("n", #12:00:00 AM#, laHoraFin)) / 60

Con la función DateDiff calculo la diferencia entre las horas en minutos (lo indico con el primer parámetro: "n"). 1440 son los minutos de un día (24 horas x 60 min/hora).

El primer DateDiff da como resultado un número negativo, porque la hora iniNoche siempre es mayor que las 12:00:00 AM (o las 0:00:00). Por este motivo hago 1440+DateDiff("n", iniNoche, #12:00:00 AM#), para obtener los minutos de noche del primer día. Otra forma de hacerlo sería: 1440-DateDiff("n", #12:00:00 AM#, iniNoche), es decir, cambias el signo y el orden de las horas.

El segundo datediff, calcula los minutos de noche del día siguiente.

Al sumar ambas cantidades y dividirlas entre 60, obtienes el número de horas del turno de noche.

Para que el resultado te salga con el formato hh:mm:ss, has de aplicarle la función TimeToString el resultado de la función fncHoras... entre 24:

TimeToString(fncHorasNocturas/24)

Muchas gracias por tus pronta respuestas.

Creo que he hecho un buen lío con el código.

Como te decía, el resultado de tu ejemplo es perfecto pero yo lo necesito con otro formato, así he hecho lo que creo que me decías y te resumo:

  1. Copio y pego la función en el mod1 Public Function TimeToString(Interval As Double) As String
    TimeToString = DateDiff("h", 0, Interval) & _
    Format$(Interval, ":nn:ss")
    End Function
  2. En la consulta origen del formulario añado lo que tu me dices y así para conocer las horas trabajadas pongo Horas trabajadas: TimeToString(fncHorasTrabajo([HoraEntrada];[HoraSalida]/24))

Me sale un número que no corresponde con la realidad.

Espero no molestarte pues ya has hecho mucho más de lo que yo hubiera hecho. 

Gracias

Tienes mal los paréntesis, ha de ser así:

TimeToString(fncHorasTrabajo([HoraEntrada];[HoraSalida])/24)

Fíjate, si no lo has hecho, en lo que comentaba Jacinto, que las funciones del ejemplo 2 del turno de mañana y tarde tienen un error en la última linea de código, falta por dividir el datediff entre 60. Quedarían así:

If DifDias > 1 Then fncHorasTurnoManana = fncHorasTurnoManana + (DateDiff("n", iniManana, finManana) / 60) * (DifDias - 1)

If DifDias > 1 Then fncHorasTurnoTarde = fncHorasTurnoTarde + (DateDiff("n", iniTarde, finTarde) / 60) * (DifDias - 1)

¡Gracias! Ha quedado realmente perfecto.

Un fuerte abrazo

Buenos días,

Primero de todo, agradecerte el que  hayas subido el ejemplo a la web de Neckkito. Seguro que le será útil a muchos que andan perdido como yo.

Ya apliqué tu ejemplo a mi base de datos y anda realmente bien con excepción de dos cosas.

  • Si ponemos como ejemplo una entrada 20:11:41 y salida 22:11:41 el resultado que sale son 13:00:00 horas noche y en un principio la formula está correcta Horas Noche: TimeToString(fncHorasNoche([HAcceso];[HSalida])/24)
  • A raiz de esto, me he dado cuenta que tampoco tiene en cuenta los segundos, aun usando el modulo.

Aunque no te puedo pedir nada más, te lo agradecería.

Saludos

Imagino que estás con el ejemplo 1, porque con el 2 no tienes ese problema.

Si ese es el caso, te recomendaría la sistemática del ejemplo 2, que es la más acertada (poner la fecha de entrada y salida facilita los cálculos), pues si optas por la sistemática del ejemplo 2, tienes que programar cada una de las posibilidades.

Y ese fue mi error: en el Case Else relativo a la hora de inicio me faltó añadir un case para las horas de salida que sean menores que las 12 de la noche y hacer el cálculo por diferencia entre las horas de entrada y salida.

Es posible que encuentres más errores de este tipo, pues no probé todas las posibles combinaciones de entradas y salidas y es posible que alguna se me pasara. Pero ahora deberías ser capaz de programar lo que pueda faltar, viendo el resto de código.

En cuanto a lo de los segundos, si quieres tenerlos en cuenta, has de cambiar las funciones para que calcule la diferencia en segundos (en vez de "n" usa "s" en el DateDiff) y sumar 86400 en vez de 1440 y dividir por 3600 en vez de 60.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas