![]() |
Cálculo de horas laborales
Buenas a todos,
he creado una función que cuenta las horas laborales entre dos fechas, descontando los días del fin de semana y los días festivos. Para ello, hay que indicarle la fecha y hora de inicio y de fin, las horas de comienzo y fin del horario, y hay que tener en una tabla los festivos (festivos es el nombre de la tabla), para que pueda descontar esos días. Es útil para por ejemplo medir las horas de cualquier servicio. Espero que sea útil. Acepto sugerencias para su mejora. Un saludo
|
Gracias compañero.
Es un buen pedazo de código. |
¿Y los dias de fiesta, qué hacemos? :p
Gracias por el aporte ^\||/ |
Muchas gracias fjcg02 ^\||/
Saludos :) |
De nada chavales,
ya que me estoy valiendo de FB para sacar adelante unos marroncillos/trabajillos, y aunque me cuesta darle a la manivela ( no tengo ninguna herramienta para depurar los SP) pues al menos aporto algo y me quedo megasupersatisfecho. Y así devuelvo a ClubDelphi y a FB la ayuda que me ofrecen desde hace muuuucho tiempo. Creo que hay un gazapo, pero os dejo a vosotros para que lo destripeis. Un saludo |
Buenas noches amigos,
dándole una vuelta de tuerca a este procedimiento, he realizado una nueva versión. Ahora permite tener en cuenta diferentes horarios, y podríamos configurar cualquier combinación que seamos capaces de soportar. Para ello, he cambiado el paradigma del cálculo. Me gustaría que si alguien tiene un rato, pudiera hacer pruebas para comprobar su correcto funcionamiento. Os pongo en cuestión. Tenemos que medir un servicio que tenemos contratado, y que debe resolvernos los problemas que le reportemos en un tiempo máximo de imaginemos X horas. Para medir cómo nos lo ejecutan, es decir, si cumplen lo estipulado, miramos los avisos cerrados por ejemplo en el mes, y si el tiempo transcurrido hasta cerrar el problema cumple el contrato, perfecto, si no, tendríamos que reclamar, pagar menos, o lo que sea. Pero nuestra empresa tiene distintas oficinas, y cada una de ellas tiene un horario diferente; bueno, cada una de ellas no, todas tienen el mismo horario, y algunas sólo abren ciertos días a la semana, ya que donde se ubican, no es necesario tener todos los días abierto o es la misma persona la que atiende dos oficinas, una de lunes a miercoles y otra de jueves a viernes. Pero esta circunstancia debemos tenerla en cuenta, ya que nuestro proveedor no podrá darnos el servicio en el tiempo acordado por no poder acceder a la oficina cerrada. Si aplicáramos el mismo horario para todas las oficinas, le penalizaríamos, y claro, se quejará y con razón. Este planteamiento también servirá para medir un servicio que ofrezcamos en nuestra empresa. Así podremos discutir con nuestro cliente disponiendo de datos fiables. Espero que hayais entendido la problemática. Al tema: En la versión anterior me hacía un lío, y al final era un engorro. En este caso, cambio totalmente la perspectiva y la verdad, es que en pocas líneas queda solucionado elegantemente. - necesitamos una tabla de horarios
- Necesitamos una tabla de detalle de los horarios. Para cada horario almacenaremos el día de la semana, el horario de ese día ( contempla mañana y tarde exclusivamente y las horas totales de cada día. por ejemplo: horario normal: de lunes a jueves de 8:00 a 17:00 y el viernes de 8:00 a 15:00 horario de lunes a miercoles de 8:00 a 13:30 y de 15:30 a 18:00 , jueves y viernes cerrado. horario de jueves y viernes de 8:00 a 13:30 y de 15:30 a 18:00, lunes a viernes cerrado. Si no abro a la tarde, pongo la misma hora que el fin de la mañana. Para indicar los días que no abro, pongo la misma hora de inicio y de fin de apertura, y las horas totales de apertura, a cero.
- Necesitamos una tabla de festivos, ya que si es fiesta no podemos imputar las horas de ese día. En ella incluiremos sólamente los días festivos del año. El día 1 de enero, el 6 de enero, ...
El truco del almendruco... es la store procedure con la que saco un registro por día desde que se abre el aviso hasta que se cierra. Esta tontada consigue que la lógica se simplifique de manera importante. Lo que hago simplemente es sacar un registro por cada día indicando además qué día de la semana es (lunes, martes...). Esto me permite hacer un inner join con la tabla detalle_horarios por el campo "día de la semana" en la que consigo los siguientes datos: dia, dia de la semana, horarios de mañana y tarde y horas totales. Si además, dado que en la tabla de detalle_horarios tengo un campo que me indica las horas de apertura diarias, con un simple filtro ( and horas_jornada <> 0), elimino los días que no son hábiles. Los que no trabajo entre semana y los que son fin de semana ( ya que los he incluido en la tabla ). Si además meto en la coctelera la tabla de festivos, eliminando los días que puedan caer en festivo en el intervalo de esa tabla, ya sólo me quedan los días que debo tratar. Lo que antes para mí era un infierno calcular, ahora es una cosa "sencilla".
El último detalle es ver cómo lo calculo. Saco la consulta, y por cada registro, voy sumando los tiempos. 1.- si los días no son ni el primero ni el último, simplemente sumo las horas_jornada del día y a otra cosa. 2. Si el día que trato es el primero, cojo la hora de inicio siempre y cuando no sea anterior a la apertura. Si es anterior, lógicamente, pondré la hora de apertura. 3.- Si el día que trato es el último, y la hora de cierre del aviso es posterior a la hora de cierre, pongo la hora de cierre de la avería como la hora de cierre de la oficina. 4.- Si el día de apertura y el de cierre no son el mismo, cojo según el caso la hora de inicio o la hora de cierre de la oficina las horas de apertura y de cierre de la avería. 5.- Un detalle final. Si tenemos mañana y tarde, y la hora de inicio del aviso es por la mañana, y la hora de cierre de la avería es por la tarde, le resto el tiempo del mediodía, ya que la oficina ha estado cerrada y no puedo atender a los técnicos. 6. -Ah, se me olvidaba, si el tiempo es negativo por algún casual, no hago nada.
Llamadas a la store procedure: devuelve 0,5 (horas) Devuelve 8,5 ( horas) Espero no haberos aburrido. La verdad es que es un tema que me ha dado muchos dolores de cabeza, y espero que no vuelva a tenerlos. Respecto al trabajo con fechas, días treanscurridos, horas , etc, ese store procedure de los días es el que me ha hecho ver la luz. Un saludo a todos. Espero su retroalimentación... |
^\||/:). Gracias.
|
La franja horaria es GMT +2. Ahora son las 06:16:44. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi