Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-02-2007
Carlos Lesca Carlos Lesca is offline
Miembro
 
Registrado: sep 2005
Posts: 31
Poder: 0
Carlos Lesca Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 26-02-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 26-02-2007
Carlos Lesca Carlos Lesca is offline
Miembro
 
Registrado: sep 2005
Posts: 31
Poder: 0
Carlos Lesca Va por buen camino
Cita:
Empezado por Lepe
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
Se que es complejo. Intentare hacer en un grafico.

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

Última edición por Carlos Lesca fecha: 26-02-2007 a las 17:14:15.
Responder Con Cita
  #4  
Antiguo 26-02-2007
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
las funciones min() y max() ¿no te sirven?
consulta la ayuda de tu manejador de bases de datos para conocer sobre estas.
__________________

Responder Con Cita
  #5  
Antiguo 26-02-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
A ver, ¿tu lo que necesitas es el resultado que da entre
(Fi1 hasta Fi2) + (Ff1 hasta Ff2) + (Fi3 hasta Ff3) ?
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #6  
Antiguo 26-02-2007
Carlos Lesca Carlos Lesca is offline
Miembro
 
Registrado: sep 2005
Posts: 31
Poder: 0
Carlos Lesca Va por buen camino
Cita:
Empezado por ContraVeneno
las funciones min() y max() ¿no te sirven?
consulta la ayuda de tu manejador de bases de datos para conocer sobre estas.
Con min() y max() obtengo cual es la fecha menor y la mayor, por no soluciono el problema.

Gracias igual.
Responder Con Cita
  #7  
Antiguo 26-02-2007
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
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.
__________________

Responder Con Cita
  #8  
Antiguo 26-02-2007
Carlos Lesca Carlos Lesca is offline
Miembro
 
Registrado: sep 2005
Posts: 31
Poder: 0
Carlos Lesca Va por buen camino
Cita:
Empezado por jhonny
A ver, ¿tu lo que necesitas es el resultado que da entre
(Fi1 hasta Fi2) + (Ff1 hasta Ff2) + (Fi3 hasta Ff3) ?
Esto me podria servir si no tuviese espacios en blanco entre medio. Tendria que restar en el 1er caso lo que existe entre Ff1 y Fi2 ya que etan contemplados el problema esta entre Ff2 y Fi3 que no hay nada.

Gracias.
Responder Con Cita
  #9  
Antiguo 26-02-2007
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
¿que consulta tienes armada hasta ahora?
__________________

Responder Con Cita
  #10  
Antiguo 26-02-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
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.
Responder Con Cita
  #11  
Antiguo 26-02-2007
Carlos Lesca Carlos Lesca is offline
Miembro
 
Registrado: sep 2005
Posts: 31
Poder: 0
Carlos Lesca Va por buen camino
Cita:
Empezado por ContraVeneno
¿que consulta tienes armada hasta ahora?
Te respondo ambas aqui.

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.
Responder Con Cita
  #12  
Antiguo 26-02-2007
Carlos Lesca Carlos Lesca is offline
Miembro
 
Registrado: sep 2005
Posts: 31
Poder: 0
Carlos Lesca Va por buen camino
Cita:
Empezado por seoane
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.
Esa es una buena opcion.

Gracias.
Responder Con Cita
  #13  
Antiguo 26-02-2007
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Cita:
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).
Y en caso de que fuera...???

Registro 1: 01/01/2006 30/06/2006
Registro 2: 01/01/2007 30/06/2007
Seria 1 año? o solo necesitas el valor qeu es consecutivo?
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #14  
Antiguo 26-02-2007
Avatar de Onti
Onti Onti is offline
Miembro
 
Registrado: jul 2003
Ubicación: La Paz - Bolivia
Posts: 500
Poder: 21
Onti Va por buen camino
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"
Responder Con Cita
  #15  
Antiguo 26-02-2007
Carlos Lesca Carlos Lesca is offline
Miembro
 
Registrado: sep 2005
Posts: 31
Poder: 0
Carlos Lesca Va por buen camino
Cita:
Empezado por vtdeleon
Y en caso de que fuera...???

Registro 1: 01/01/2006 30/06/2006
Registro 2: 01/01/2007 30/06/2007
Seria 1 año? o solo necesitas el valor qeu es consecutivo?
En este caso deberia sacar los dias que estan en blanco o sea del 30/06/2006 al 01/01/2007. En total me quedaria 1 año. Se que es complejo, por eso es que hice la pregunta al foro.

Gracias.
Responder Con Cita
  #16  
Antiguo 26-02-2007
Carlos Lesca Carlos Lesca is offline
Miembro
 
Registrado: sep 2005
Posts: 31
Poder: 0
Carlos Lesca Va por buen camino
Thumbs up

Cita:
Empezado por Onti
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"
Interesante, Creo que podria estar en el camino con tu sugerencia. Pero en el caso de en que hay dias en blanco no se si funcionaria, pero ya lo estoy probando.

Mil Gracias.
Responder Con Cita
  #17  
Antiguo 27-02-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Yo tengo una idea muy simple.

Usaremos un array, para que se entienda :
Código Delphi [-]
var Dias : array [fechaIni... fechaFin] of boolean;
begin

// Si trabajó el día 1 de enero de 2007
Dias[01/01/2007] := true

// Si no trabajó
Dias[01/01/2007] := false

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
Código Delphi [-]
var Fini, Ffin :TDate;
     totDias, cont:integer;
     Dias : array of boolean;

// inicializar datos

Fini := 01/01/2007 ; // fecha inicial para computar;
FFin := Fini + (35*365); //Fecha fin dentro de 35 años;

totdias := trunc(Ffin-Fini); // restando fechas nos dan los días que han transcurrido entre ambas
SetLength(dias, totdias-1); // -1 porque empieza en cero el array
for cont:= low(dias) to high(dias) do
  dias[cont] := false; // inicializamos el array
end;


procedure anadir periodo(F1, F2:TDatetime);
  var indice, trabajados :integer;
begin
  trabajados := trunc (F2 -F1);
  indice := trunc(f1-Fini); 
// como el indice del array empieza en cero, restamos a todo Fini.
// Fini será la variable declarada anteriormente, será una global.

for cont := indice to trabajados do
 dias[cont-1] := true; // -1 porque empieza en cero el array, ¿recuerdas? 
end;

Como ves es un pseudocódigo, pero creo que puede servir.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 27-02-2007 a las 12:27:18.
Responder Con Cita
  #18  
Antiguo 27-02-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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:
Código Delphi [-]

procedure anadir periodo(F1, F2:TDatetime);
  var indice, trabajados :integer;
begin
  trabajados := trunc (F2 -F1) ;
  indice := trunc(f1-Fini); 
// como el indice del array empieza en cero, restamos a todo Fini.
// Fini será la variable declarada anteriormente, será una global.

  for cont := indice to trabajados do
  begin
    if dias[cont-1] = false then inc(FDiasTrabajados);
    // si estaba a false, no estaba computado ese día
   // por tanto lo computamos ahora.

   // Si estaba a true, significa que es una fecha solapada con otro periodo
   // añadido anteriormente

    dias[cont-1] := true; // -1 porque empieza en cero el array, ¿recuerdas? 
  end;
end;

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 27-02-2007 a las 12:27:30.
Responder Con Cita
  #19  
Antiguo 27-02-2007
Carlos Lesca Carlos Lesca is offline
Miembro
 
Registrado: sep 2005
Posts: 31
Poder: 0
Carlos Lesca Va por buen camino
Thumbs up

Cita:
Empezado por Lepe
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:
Código Delphi [-] procedure anadir periodo(F1, F2:TDatetime);
var indice, trabajados :integer;
begin trabajados := trunc (F2 -F1) ; indice := trunc(f1-Fini); // como el indice del array empieza en cero, restamos a todo Fini.
// Fini será la variable declarada anteriormente, será una global.
for cont := indice to trabajados do begin if dias[cont-1] = false then inc(FDiasTrabajados);
// si estaba a false, no estaba computado ese día
// por tanto lo computamos ahora.
// Si estaba a true, significa que es una fecha solapada con otro periodo
// añadido anteriormente
dias[cont-1] := true; // -1 porque empieza en cero el array, ¿recuerdas?
end;
end;


Saludos
Interesante. Voy a verlo con mas detnimiento

Gracias.
Responder Con Cita
  #20  
Antiguo 27-02-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
A ver... hoy estoy algo resacoso donde dice:
Código Delphi [-]
 for cont := indice to trabajados do

debe decir:
Código Delphi [-]
 for cont := indice to (indice + trabajados) do

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

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Fechas en sql carymar SQL 2 15-06-2006 18:35:10
Las horribles fechas, control de fechas Huer OOP 6 18-10-2005 19:11:49
Fechas jmlifi Varios 2 11-04-2005 16:40:22
fechas davidgaldo Conexión con bases de datos 4 02-03-2004 17:21:51
Fechas Novás Varios 1 20-10-2003 13:39:57


La franja horaria es GMT +2. Ahora son las 22:59:54.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi