2010-01-26 10 views
7

Ejecutamos un servicio basado en un SLA de 2 días hábiles, por lo que si la solicitud se envía a la 1 pm del lunes, debe completarse antes de la 1 pm del miércoles.PHP para calcular el número de horas de oficina entre dos fechas

Así que en la base de datos tengo dos marcas de tiempo MySQL AAAA/MM/DD HH: MM: SS, y necesito alguna forma de calcular el tiempo entre las dos fechas de trabajo, en función del horario de oficina de 9 a.m. a 5 p.m.

¿Alguien puede darme alguna idea?

Respuesta

0

En términos generales, las marcas de tiempo dado A y B, donde A es la hora de inicio:

  • determinar el número de días entre A y B (hay formas fáciles de hacer esto), llamar a esta D
  • si la marca de tiempo B es mayor o igual a la de A, luego sume la diferencia de tiempo H, dando D (días) + H (tiempo)
  • si la HH: MM: SS para la marca de tiempo B es menor que para A, restar 1 de D y sumar 8 horas menos la diferencia de tiempo H, lo que da D - 1 (días) + 8 (horas) - H

En su ejemplo, si A es 1pm el lunes y B es 1pm el miércoles, entonces D es 2. Dado que los tiempos son los mismos, H es 0 y entonces la diferencia total es 2 días hábiles.

Si B fuera las 3 pm del miércoles, la diferencia total sería de 2 días más 2 horas.

Si B fuera el miércoles a las 9 a.m., la diferencia total sería de 1 día más 4 horas.

El método anterior no maneja los fines de semana ni las vacaciones, por lo que tendría que hacer las modificaciones apropiadas.

1

La manera más simple sería almacenar una tabla en su base de datos con una línea para cada día, que contenga el tiempo de trabajo disponible en ese día. Esto le permite manejar las vacaciones y los fines de semana con mucha granularidad, y puede obtener la cantidad de tiempo disponible ejecutando una suma a lo largo de los días entre las dos fechas especificadas por el usuario.

0

Crear esto solo a través de SQL es difícil. En MySQL la diferencia entre una marca de tiempo se puede calcular de esa manera ...

SELECT TIMESTAMPDIFF(HOUR,T.ts2,T.ts1) 
FROM test AS T; 

... pero eso OFC no toma ningún horario de oficina en consideración.

Tenga en cuenta que SQL no conoce sus horas de oficina, y que pueden depender de otros factores también (fines de semana, festivos o lo que sea). Para poder hacerlo, primero debe establecer una tabla de calendario y luego comenzar los cálculos.

Tuve un problema similar hace unos años, allí utilicé un script de back-end en el que definí los tiempos y las vacaciones. Luego calculé la marca de tiempo futura al insertar los datos en primer lugar, eso fue mucho más fácil y mucho más flexible.

Cuestiones relacionadas