Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-01-2019
shoulder shoulder is offline
Miembro
 
Registrado: abr 2008
Posts: 441
Poder: 16
shoulder Va por buen camino
Suma Antiguedad Laboral

Una duda tengo que sumar rangos de fechas de una persona por actividad laboral:
Ej: 01/01/2015 - 02/01/2016 = 1 año y 1 un dia
01/01/2017 - 02/04/2018 = 1 año - 3 meses - 2 dias etc...


Tengo la funcion que me convierte por rango de fechas a año-mes -dia pero no encuentro nada que me sume todos los resultados y me de el valor final ya que si sumo la cantidad de dias entre todos los rangos no me da igual.


Lo que hago en ese momento es suma total de dias de todos los rangos pero se que no es real el valor.




Código Delphi [-]
....

...('select DATEDIFF(fecha_final,a.fecha_inicio) from antiguedad  
....('where documento = :docu')...
while  not zquery5.Eof do
           begin
             cantidaddias :=  zquery5.Fields[0].AsInteger + 1 ;
              sumadias := sumadias + cantidaddias;
             .....
              zquery5.Next;
           end;





  dias := sumadias;
  Resul:= dias/30.41;
  meses := trunc(resul);
  
  dias1 := dias mod 30;

 if dias1 = 1 then dias1 := 0;
  case meses of
    0:
    begin
      edit6.Text := intToStr(dias);


    end;
    1..24:
    begin
      edit5.Text := intToStr(meses);
      edit6.Text := intToStr(dias1);

    end;
  else
    begin
      edit4.Text := intToStr(meses div 12);
      edit5.Text := intToStr(meses mod 12);
      edit6.Text := intToStr(dias1);
    end;
  end;
Responder Con Cita
  #2  
Antiguo 29-01-2019
Avatar de TiammatMX
TiammatMX TiammatMX is offline
Miembro
 
Registrado: jun 2006
Ubicación: Universo Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Puebla\Heróica Puebla de Zaragoza\Jardines de San Manuel\Home
Posts: 746
Poder: 18
TiammatMX Va camino a la fama
¿Y no te sirve calcular con DaysBetween() o alguna otra función de manejo de fechas?
__________________
Felipe Eduardo Ortiz López. Delphi programmers does it recursively...

"Un programador, es un creador de universos en donde sólo él es responsable. Universos de complejidad prácticamente ilimitada que se puede crear en forma de programas de ordenador." - Joseph Weizenbaum.

Témele a los profetas... y a aquellos que están listos para morir por "la verdad", ya que como regla general hacen morir a muchos otros con ellos, frecuentemente antes que ellos, y a veces en lugar de ellos. — Umberto Eco
Responder Con Cita
  #3  
Antiguo 29-01-2019
shoulder shoulder is offline
Miembro
 
Registrado: abr 2008
Posts: 441
Poder: 16
shoulder Va por buen camino
Antiguedad

Si gracias pero mi duda es lo mismo calcular el day between y sumar todos los dias y de la cantidad de dias que medio dio, ejemplo : 2191 dias llevarlo a Año Mes Dia me parece que no da igual que calcular los rangos y sumar de esas partes los Años Mes Dia, porque no son dias corridos..


estoy inventando esto: no se si me da bien debo verificar.


Código Delphi [-]
.......................................

 while  not zquery5.Eof do
           begin

             DecodeDate(zquery5.Fields[0].AsDateTime, AAI, MMI, DDI);
             DecodeDate(zquery5.Fields[1].AsDateTime, AAF, MMF, DDF);

   AA := AAF - AAI;

   if( MMI <= MMF ) then
      MM := MMF - MMI
   else
   begin
      MM := MMF + 12 - MMI;
      AA := AA - 1;
   end;

   if( DDI <= DDF ) then
      DD := DDF - DDI
   else
   begin
      DD := DDF + MonthDays[IsLeapYear(AAF),MMF] - DDI;
      MM := MM - 1;
   end;

   if MM < 0 then
   begin
      AA := AA - 1;
      MM := 12 + MM;
   end;

  aa1 := aa+aa1;
  mm1 := mm + mm1;
  dd1 := dd + dd1;

  If dd1 > 29 then
     begin
       dd1:= dd1 - dd;
       mm1 := mm1 + 1;
     end;


  if mm1 > 11 then
     begin
       mm1 := mm1 - 12;
       aa1 := aa1 + 1;

     end;



              zquery5.Next;
  end;

edit4.Text  := inttostr(aa1);
edit5.Text  := inttostr(mm1);;
edit6.Text  := inttostr(dd1);
Responder Con Cita
  #4  
Antiguo 29-01-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Un campo fecha es un número. Si usas la función indicada por TiammatMX, te devuelve los días entre fechas. Haces la suma y listo.


Código SQL [-]
select sum( DaysBetween(fechinicio,fechafin) ) as sumadias from tbTablaquesea where usuario=elusuarioquesea
Responder Con Cita
  #5  
Antiguo 29-01-2019
shoulder shoulder is offline
Miembro
 
Registrado: abr 2008
Posts: 441
Poder: 16
shoulder Va por buen camino
Antiguedad

Gracias Casimiro entendi, pero mi pregunta es: da igual los valores en año mes dia de hacer una sumatoria de dias y ese valor descomponerlo en AAMMDD.


Que como son rangos de fechas no correlativos tomar esos rangos y descomponerlos en AAMMDD y despues sumarlos?. Al tener algo correlativo es como que dijiera 2000 dias del 01/01/2011 al 31/12/2018 y en realidad estos mismos no fueron correlativos y entre medio pudo haber existido años bisiestos o meses con 31 0 30 segun los rangos.


Perdon por si no me supe expresar.


Saludos.
Responder Con Cita
  #6  
Antiguo 29-01-2019
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

En la sección Trucos el compañero MaMu puso un codigo para Calcular EDAD en años, meses y dias de una Persona.

Creo que con unas pocas modificaciones te serviría para el caso:
Código Delphi [-]
...
type
  TAntiguedad = record
    year : Word;
    month: Word;
    day  : Word;
  end;

function Antiguedad(Desde, Hasta: TDate): TAntiguedad;
var
  a1,m1,d1: Word;
  a2,m2,d2: Word;
  Year, Month, Day: Word;
begin
  DecodeDate(Desde, a1, m1, d1);
  DecodeDate(Hasta, a2, m2, d2);

  Year := a2 - a1;

  if ( m1 <= m2 ) then
     Month := m2 - m1
  else
  begin
    Month := m2 + 12 - m1;
    Dec(Year);
  end;

  if ( d1 <= d2 ) then
    Day := d2 - d1
  else
  begin
    Day := d2 + MonthDays[IsLeapYear(a2), m2] - d1;
    Dec(Month);
  end;

  if Month < 0 then
  begin
    Year := Year - 1;
    Inc(Month, 12);
  end;

  Result.year  := Year;
  Result.month := Month;
  Result.day   := Day;
end;

// Ejemplo de uso:
procedure TForm1.Button1Click(Sender: TObject);
var
  d1, d2: TDate;
  a: TAntiguedad;
begin
  d1 := StrToDate('01/01/2017');  
  d2 := StrToDate('02/04/2018'); 
  a  := Antiguedad(d1, d2);
  ShowMessageFmt('años:%d, meses:%d, días:%d',[a.year, a.month, a.day]); // (*)

  d1 := StrToDate('29/12/2005');
  a  := Antiguedad(d1, Date());
  ShowMessageFmt('años:%d, meses:%d, días:%d',[a.year, a.month, a.day]);
end;
(*) Fechas tomadas de tu primer mensaje y da como resultado: años: 1, meses: 3, días: 1

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 29-01-2019
shoulder shoulder is offline
Miembro
 
Registrado: abr 2008
Posts: 441
Poder: 16
shoulder Va por buen camino
antiguedad

Gracias entonces despues sumo todas esas partes para que me de la totalidad de antiguedad haciendo la formula que hice mas arriba.
Responder Con Cita
  #8  
Antiguo 29-01-2019
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.
Cita:
Empezado por shoulder Ver Mensaje
Gracias entonces despues sumo todas esas partes para que me de la totalidad de antiguedad haciendo la formula que hice mas arriba.
No estoy entendiendo..., la función Antigüedad ya devuelve la totalidad del tiempo transcurrido entre fechas en años, meses y días. ¿ Por que necesitas sumar esos datos ?

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 29-01-2019
Avatar de mamcx
mamcx mamcx is online now
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Date una mirada a http://www.clubdelphi.com/foros/showthread.php?t=93348, y coloca datos concretos.
__________________
El malabarista.
Responder Con Cita
  #10  
Antiguo 30-01-2019
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Creo que ya lo han comentado y tal vez llego tarde, pero creo que en temas de fechas la unidad "básica" es 1 día.
Por lo tanto, creo que lo más senciilo es pasar a días cada uno de los intervalos y una vez tengas los días totales, pasar eso al tipo Antiguedad (es decir, sacar los años, meses y días a partir del total de días).
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Antiguedad de saldos en sql 30,60,90, mas erasmorc SQL 4 18-06-2012 23:56:31
Problema laboral josejp1 La Taberna 14 04-07-2011 22:37:52
Consulta Por Antiguedad Jvilomar MS SQL Server 1 07-05-2008 16:17:28
Pedidos con un mes de antiguedad ¿¿¿cómo??? !!!!!!!! david_uh SQL 5 06-08-2007 06:54:30


La franja horaria es GMT +2. Ahora son las 17:43:33.


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