![]() |
Simultaneidad de fechas
Hola a todo el foro:
Intentare de explicar este tema que es bastante complejo a ver si alguien puede darme una ayuda. Tego varias fechas las cuales puede tener simultaneidades, es decir puedo tener 01/01/2005 (dd,mm,aaa) al 10/09/2005, y otras que sean 03/05/2005 al 15/12/2005. Las fechas que se encuentran entre el 03/05/2005 al 10/09/2005 estan incluidas y tendria que hacerlas desaparecer para que me queden del 01/01/2005 al 15/12/2005. quizas este es el caso mas sencillo, ya que puede aparecer del 01/01/2005 al 03/06/2005 y del 01/08/2005 al 12/12/2005 la cual no se superponen pero hay un tiempo en blanco el cual deberia desaparecer. Todos estos datos estan en una base de datos la cual tengo que recorrer e ir calculando esto para obtener una fecha de inicio y una de final sin espacios en blanco y sin superposiciones. Si alguien tiene alguna idea se los agradezco muchisimo. :eek::eek: |
Yo al menos no entiendo nada.
No sé si quieres borrar las fechas, los registros enteros o qué. Tampoco entiendo si todas las fechas se refieren a un mismo campo de la misma tabla o si son distintas. Quizás explicando qué clase de tareas es, se entienda mejor. Eso de espacios en blanco y superposiciones... ni sé de que va. Es importante decir qué base de datos usas para buscar una solución que se adapte. Saludos |
Cita:
Fi1--------------------------------Ff1 ______________Fi2------------------------Ff2 ___________________________________________________Fi3-----------Ff3 Si te fijas en entre la Fi2 y Ff1 existe un periodo de tiempo simultaneo, y entre al Ff2 y la Fi3 hay un periodo de tiempo en blanco. Si el total entre Fi1 y Ff3 es de 200 dias, yo tengo que obtener el tiempo real sin sumultaneidades que por ejemplo sera de 150 dias y eso es lo que necesito para obtener un puntaje. Es para hacer un sistema de antiguedades de docentes. Un maestro puede estar trabajndo en el mismo cargo en 2 escuelas al mismo tiempo. Para obtener la antiguedad no puedes sumarle los dos porque fue durante el mismo periodo, debes sacar la simultaneidad. El caso del ejemplo de F1 y 2 tus fechas serian Fi1 (como fecha de inicio) y Ff2 como fecha de final, sacando el periodo de tiempo que existe entre Fi2 y Ff1 ya que tanto en uno como en el otro lo tienes computado. se que es un tema complejo. Gracias. PD: lo que he puesto con ___ no tiene valor, simplemente para que no quede alineado a la izquierda. Solo lo que esta entre las F--------F |
las funciones min() y max() ¿no te sirven?
consulta la ayuda de tu manejador de bases de datos para conocer sobre estas. |
A ver, ¿tu lo que necesitas es el resultado que da entre
(Fi1 hasta Fi2) + (Ff1 hasta Ff2) + (Fi3 hasta Ff3) ? |
Cita:
Gracias igual. |
vamos a ver... según entiendo, lo que quieres es conocer cuanto tiempo ha trabajado un profesor. En tu base de datos supongo que tienes guardadas las fechas de inicio y fin de cada vez que ese profesor ha trabajado.
Según esto y si mis dotes de adivinador son correctas, solo haría falta seleccionar la fecha menos (función min) para obtener la primer fecha en la que ha trabajado y la fecha mayor (función max) para obtener la última vez que trabajo, teníendo eso, ya podrías hacer tu consulta. |
Cita:
Gracias. |
¿que consulta tienes armada hasta ahora?
|
Pues a mi se me ocurre crear una array con todos los periodos y ordenar el array por la fecha de inicio de cada periodo. Luego solo tenemos que recorrer el array posición a posición y sumar los días de ese periodo y restarle los días que se solapan con el periodo anterior.
|
Cita:
Para cada profesor yo tengo la fecha de inicio y de final de cada periodo. Un mismo profesor tiene varias fechas de inicio y de fin. Hagamos el ejemplo mas simple. si el profesor trabajo del 01/01/2006 hasta el 31/12/2006 en dos lugares al mismo tiempo, su antiguedad es de 1 año, aunque tenga 2 puestos en 2 escuelas diferentes. Ahora si trabajo del 01/01/2006 hasta el 30/06/2007 es de 1.5 años (1 año y medio). Esos son 2 registros diferentes, lo que significa que el periodo 01/01/2006 al 31/12/2006 esta contemplado en ambos. Lo que yo tengo que hacer es de uno de los dos borrar ese periodo y quedarme solo con uno para que el total me de 1.5 años y no 2.5. De esa manera elimino la simultaneidad, porque caso contrario me daria mas puntaje que el que realmente deberia tener. Si por cada. Registro 1: 01/01/2006 31/12/2006 Años: 1 Registro 2: 01/01/2006 30/06/2007 Años: 1.5 Total: 2.5 Total Real: 1.5 (es lo que tengo que obtener). Gracias. |
Cita:
Gracias. |
Cita:
Registro 1: 01/01/2006 30/06/2006 Registro 2: 01/01/2007 30/06/2007 :confused: Seria 1 año? o solo necesitas el valor qeu es consecutivo? |
Hola Carlos:
Podrias hacer algo asi: //. Inicializas 0. TotDias=0 ; Inicio=Fi1; Fin=Ff1 // tomas 2 fechas 1. obtienes los días entre Fi1 y Ff1 d1=dias(Fi1,Ff1) 2. obtienes los días entre Fi2 y Ff2 d2=dias(Fi2,Ff2) 3. obtienes los días comunes d3=dias(Fi2,Fin) 4. sumas TotDias=TotDias+((d1+d2)-d3) 5. actualizas Fin Fin=Ff2 // Vas al siguiente reg 6. Obtienes dias entre Fi3 y Ff3 d2=dias(Fi3,Ff3) 7. Obtienes dias comunes d3=dias(Fi3,Fin) 8. Sumas TotDias=TotDias+(d2-d3) , etc Es solo una idea pueden haber detalles porque lo hice a "mano a la volada" |
Cita:
Gracias.:( |
Cita:
Mil Gracias. |
Yo tengo una idea muy simple.
Usaremos un array, para que se entienda :
Claro, esto no puede implementarse así de fácil, pero esa es la idea. El punto fuerte está claro, no tendrás problemas para saber los días que ha trabajado, recorres todo el array y si tiene un true lo computas, si tiene un false no lo computas. Añadir el periodo de fechas trabajado es muy simple... un bucle entre las dos fechas poniendo a true el día trabajado. La desventaja es clara, si vamos a computar la vida laboral de un trabajador, serían 35 años por 365 días.... un array de 12.775 posiciones....tampoco sería muy excesivo, ya que un array son punteros y lo que guarda es un boolean. No debería tardar mucho. ¿Como se implementa? Vamos a usar un array dinámico
Como ves es un pseudocódigo, pero creo que puede servir. Saludos |
Otra cosita:
Yo todo eso lo encapsularía dentro de un TObject (una clase). De tal forma que al añadir un periodo de fechas, a la misma vez que pongo a true el índice del array incrementaría la cuenta de una variable privada "diasTrabajados", de esta forma no tendremos que recorrer todo el array para saber lo dias totales, es decir:
Saludos |
Cita:
Gracias. |
A ver... hoy estoy algo resacoso :D :D donde dice:
debe decir:
Si trabajados tiene el valor 12 e índice tiene 7, el bucle que tiene el fallo solo constaría de 12-7 = 5 iteraciones, cuando en realidad, debe hacer 12 iteraciones. Revisa concienzudamente el código, ya digo... la fresca rubia de anoche me dejó secuelas :rolleyes: Saludos |
La franja horaria es GMT +2. Ahora son las 05:01:27. |
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