Cómo restar horas de distintos días en Access

Actualmente tengo un formulario que guarda varios registros como son: la fecha (dia) y hora de entrada (tiempohora) al formulario y sólo la hora de salida del formulario (tiempohorasal). Éstos datos se registran en una tabla donde hay otro campo que calcula la diferencia entre horas "salida - entrada".

En el campo que calcula la diferencia entre horas "tiempocalc", tengo el siguiente condicional:

tiempocalc: SiInm([tiempohorasal]<[tiempohora];Redondear(DifFecha("n";[tiempohora];[tiempohorasal])/60;1)+24;Redondear(DifFecha("n";[tiempohora];[tiempohorasal])/60;1))

Con éste condicional tengo en cuenta varios factores, pero aun hay uno que se me escapa; pongo un ejemplo:

       Dia                         Tiempohora           Tiempohorasal           Tiempocalc

11/07/2018                          17:25                        19:30                            2,1    

11/07/2018                          19:30                        20:00                            0,5    

11/07/2018                          20:00                        22:30                            2,5    

12/07/2018                          22:30                        02:00                            3,5

El tiempo calculado de 2,5 es incorrecto ya que las 20:00h y las 23:30h son de días distintos, de forma que habría 26,5 horas de diferencia. ¿Cómo puedo solucionarlo?

3 respuestas

Respuesta
3

Si no tienes un campo para la fecha de salida, o guardas la fecha y hora de salida en el mismo campo, es imposible que access sepa que esas 22:30 de salida son de un día distinto...

En mi opinión, la mejor opción es que registres también la fecha de salida, y hagas los cálculos teniendo en cuenta los dos valores (fecha y hora), lo que además, tiene la ventaja de que te simplifica los cálculos, pues en vez de necesitar una fórmula condicional como la que usas en tiempocalc, podrías hacerlo simplemente así:

tiempocalc: Redondear(DifFecha("n";CFecha(Dia & " " & [tiempohora]);CFecha(DiaSal & " " & [tiempohorasal]))/60;1)

Respuesta
2

Lo primero de todo es, cuando está rellenando el tercer registro y le pones 22:30 ¿cómo sabe el sistema que estás hablando del día siguiente? Otra cosa sería que todos los registros, al menos la fecha y la hora entrada ya estuvieran rellenos.

Por otro lado, los ordenadores no trabajan con fechas, trabajan con números y las horas son decimales de día, por eso aunque la diferencia te la está haciendo bien, pero, le está sumado un día. He intentado explicarlo en el formulario El día 11/07/2018 como tal no existe, existe el 43292. La hora 19:30 como tal no existe, existe el 0,8125 del día 43292, pero si multiplicas 0,8125 por 24, su parte entera te dará 19.

Por eso te he puesto en el formulario los campos numéricos.

Cuando quieres hacer la diferencia de las 22:30 del día 12/07/2018 y las 20:30 del día 11/07/2018 en realidad está haciendo lo del encabezado, en que en el evento Después de actualizar del cuadro de texto 21 le digo

Resultado=(texto19-texto21)*24

Dicho todo esto, si tengo el formulario

Y pulso el botón

El código del botón es

Pero el campo DifH es numérico simple

Lo de 1+ datediff es por si alguna fecha del formulario difiriera de la anterior en más de un día.

Respuesta

Con gusto le ilustro unas imágenes de una aplicación que elaboré hace un tiempo. Consiste en la asignación de turnos para vigilantes, en donde se contemplan diferentes tipos de horas extras teniendo en cuentas los días festivos de Colombia. En este ejemplo no se requiere registrar la fecha de salida, toda vez, que ésta se calcula con base en los parámetros D=Diurno N=Nocturno.

1. Se parametrizan los tipos de hora extra. No entro en detalle para no hacer extensa la explicación.

2. Se crean los empleados (vigilantes)

3. Se definen las secciones donde se presta el turno.

4. Se definen las clases de turno D=Diurno N=Nocturnos C=Compensatorio F=Descanso legal  P=Permiso V=Vacaciones

Con base en la información anterior se crean los turnos por vigilante. Ver figura siguiente

A continuación mediante este formulario se asignan los turnos del mes, el formulario se llena automáticamente con los días de mes. Ver figura.

Observe que no se necesita fijar la fecha de salida, ésta se calcula con una función y con base en el tipo de turno. Al grabar obtenemos algo como la figura siguiente.

Observe el día 3 se eligió el tipo de turno NOCTURNO y el vigilante inicia a las 20.00 horas y sale a las 22.30 horas (como los turnos deben ser mayores o iguales a 8 horas en la función se asume que es el día siguiente), en consecuencia debe liquidar 26 horas 30 minutos (26.3).

Lo anterior permite hacer la distribución del turno del vigilante. Ver figura siguiente.

Observe que hay 2 encabezados en color rojo, 01-jul-18 por ser Domingo y 02-jul-18 es festivo en Colombia. Ahora con base en los turnos se procede a obtener la liquidación por vigilante. Ver figura siguiente.

Observe como se muestran en rojo los días dominicales y festivos y en la columna ENTRA del día 3 aparece que el vigilante ingreso al turno a las 20 horas y en la columna SALE columna DIA aparece que sale el día 4 de julio a las 22,30 horas y en la columna LABORO 26,3. Por último se obtiene el reporte de la liquidación del turno y el costo de las horas extras.

NOTA: Para este proyecto se requieren de 35 funciones para la realización del cálculo de los días festivos fijos y trasladables al día lunes en Colombia, más las funciones para obtener la fecha de salida y el tiempo laborado. Igualmente utilizo el formato de fecha militar. Si sabe VBA y quiere conocer el ejemplo lo puede solicitarlo al correo [email protected]

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas