Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Calculo diferencia años entre dos fechas (https://www.clubdelphi.com/foros/showthread.php?t=96107)

jafera 14-02-2023 10:24:50

Calculo diferencia años entre dos fechas
 
Buenos dias.

Hace ya un tiempo que no aparecía por aquí pues tenía un poco olvidada la programación, pero ahora me ha surgido la necesidad de actualizar una base de datos y en ella debo controlar la diferencia en años entre dos fechas.
El proceso que hago es el siguiente:

Código Delphi [-]
procedure TF_Arbitres.Calcul_Anyo;
var
  Anio:TDatetime;
  a,m,d,a1,m1,d1,a2,m2,d2: Word;
begin
        Anio := Now;
        DecodeDate(Anio, a,m,d);
        Anio := F_ModulDades.ArbitresDATA_1_LLIC.Value;
        DecodeDate(Anio, a1,m1,d1);
        if F_ModulDades.ArbitresDATA_BAIXA.Value <> 0 then
        begin
                DecodeDate(F_ModulDades.ArbitresDATA_BAIXA.Value, a2,m2,d2);
                Anyo:= a2-a1;
        end
        else
        Anyo:= a-a1;
end;


Este proceso funciona bien pero me da un resultado "erróneo o no deseado".
Si tengo como fecha inicio 1/1/2000 y fecha fin 31/12/2005, el resultado es 5, pero para mi el resultado debería ser 6 ya que los años pasados son:
2000, 2001, 2002, 2003, 2004 y 2005.

Como podria controlar esto?
Una forma "fácil" aunque no se si muy correcta seria sumar 1 al valor Anyo

Anyo:=(a-a1)+1

No se si se podría hacer calculando el numero de días o meses y luego dividir....

Como siempre gracias por adelantado por leerme.

Saludos

Josep

Neftali [Germán.Estévez] 14-02-2023 11:34:17

El problema es que para dar una solución debes especificar bien cual es la salida que quieres...

Contesta cual sería la respuesta a las siguientes fechas (explicado de una forma programática):

1/1/2000 y 31/12/2005 (6,0027 años) (6 años y 1 día) => Según tú esto debería dar 6 ¿Porqué?
1/1/2000 y 02/01/2005 (5,0082 años) (5 años y 3 días) => ??
1/6/2000 y 31/06/2005 (5,0822 años) (5 años y 30 días)=> ??
1/6/2000 y 31/12/2005 (5,5863 años) (5 años y 214 días)=> ??

AÑADO1: Te he puesto la diferencia de años en decimal a ver si te ayuda...
AÑADO2: Diferencia en años y días...

jafera 14-02-2023 11:42:59

Buenos días y gracias por la respuesta.



Para mi son siempre años naturales, cuando un comisario saca licencia vale por un año natural, tanto si la saca el 1/1, como el 30/6, siempre caduca el 31/12 de ese año.
Con lo que una licencia del 1/1/2020 finaliza el 31/12/2020 y la antigüedad es un año, que es el valor que quiero acumular.
Si la saca el 1/1/2020 y la renueva cada año hasta el 2022, luego en 2023 no renueva el valor a guardar es 3, 2020, 2021 y 2022, Aquí tendrá fecha de baja el 31/12/2022.


No se si se entiende bien


Saludos


Josep

duilioisola 14-02-2023 12:03:48

Código Delphi [-]
Anyos := YearOf(Today) - YearOf(F_ModulDades.ArbitresDATA_1_LLIC.Value) + 1
Por lo tanto :
  • si saca la licencia el 30/06/2020 y hoy estamos a 01/07/2020 (1 dia) -> 2020 - 2020 + 1 = 1
  • si saca la licencia el 30/06/2020 y hoy estamos a 30/06/2021 (1 año) -> 2021 - 2020 + 1 = 2
  • si saca la licencia el 30/06/2020 y hoy estamos a 14/02/2023 (3 años y varios meses) -> 2023 - 2020 + 1 = 4

jafera 14-02-2023 12:18:25

Gracias duilioisola


Es más o menos lo que decía yo de sumar 1 al resultado.
Pensaba que habría otra forma, pero me parece correcto y simple.


Saludos


Josep


La franja horaria es GMT +2. Ahora son las 14:21:20.

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