Página 1 de 1

Rotina de idade

Enviado: 03 Mar 2023 09:39
por JoséQuintas
Está rolando no harbour-users, sobre uma rotina de idade, uma minha e uma de outro usuário.

O outro usuário levantou uma situação, mas agora levantei outra.

É curiosa a situação:

Uma criança nasceu em 28/fevereiro/2023
Em 28/03 vai ter 1 mês
Em 29/03 vai ter 1 mês e 1 dia
Em 30/03 vai ter 1 mês e 2 dias
Em 31/03 vai ter 1 mês e 3 dias
Em 01/04 vai ter 1 mês e 1 dia

Em 01/04 ela ficou mais nova 2 dias !!!!

E aí ? o que dizem ?
E num cálculo financeiro ? será mais barato o juros dia 01 do que dia 31 ?

Rotina de idade

Enviado: 03 Mar 2023 09:53
por JoséQuintas
JoséQuintas escreveu:O outro usuário levantou uma situação, mas agora levantei outra.
O que o outro usuário levantou foi uma situação oposta, tratada diferente pelas rotinas

31/01 a 28/02
31/01 a 01/03

Na minha rotina acontece parecido com a anterior, onde 31/01 a 28/02 acusa 1 mês e 3 dias, e em 01/03 um mês e 1 dia.

Rotina de idade

Enviado: 03 Mar 2023 12:15
por JoséQuintas
JoséQuintas escreveu:Uma criança nasceu em 28/fevereiro/2023
Em 28/03 vai ter 1 mês
Em 29/03 vai ter 1 mês e 1 dia
Em 30/03 vai ter 1 mês e 2 dias
Em 31/03 vai ter 1 mês e 3 dias
Em 01/04 vai ter 1 mês e 1 dia

Em 01/04 ela ficou mais nova 2 dias !!!!

E aí ? o que dizem ?
E num cálculo financeiro ? será mais barato o juros dia 01 do que dia 31 ?
Acho que vai ser melhor manter como 1 mês até dia 31.
Ninguém vai reclamar de ter até 4 dias de festa!!!

Rotina de idade

Enviado: 03 Mar 2023 14:39
por Softwhouse
Melhor é consertar isso.

Rotina de idade

Enviado: 03 Mar 2023 15:48
por Vlademiro
O problema está no conceito de mês.
Quando dizemos 1 mês e 1 dia estamos considerando o mesmo dia, só que no mês subsequente somado de 1 dia.

Olha o exemplo usando AddMonth() da hb_ct

Código: Selecionar todos

*/
PROCEDURE Main

    ? "Add 1 month to 2020-02-28", AddMonth( STOD("20200228") , 1 ) // 2020-03-28
    ? "Add 1 month to 2020-02-29" , AddMonth( STOD("20200229") , 1 ) // 2020-03-29
    ? "Add 2 months to 2020-02-28" , AddMonth( STOD("20200228") , 2 ) // 2020-04-28
  

RETURN

Rotina de idade

Enviado: 03 Mar 2023 15:51
por Vlademiro
Complementando...

Código: Selecionar todos

Add 1 month to 2020-01-31 ---> 2020-02-29

Rotina de idade

Enviado: 03 Mar 2023 18:52
por JoséQuintas
dates.png
Uma comparação entre as duas rotinas.
Destaquei aonde a diferença está maior.

Rotina de idade

Enviado: 03 Mar 2023 18:57
por JoséQuintas
Pegando na tabela: de 04/janeiro/2020 a 03/março/2023
nos dois dá 3 anos e 1 mês
mas na minha dá 30 dias, na outra 27 dias.

a minha considera 31 - 4 = 27 dias de janeiro + 3 de março
a outra... sei lá...

Rotina de idade

Enviado: 24 Ago 2023 13:54
por Softwhouse
Olá Quintas,
Vc consegue o código fonte da outra rotina ?

Rotina de idade

Enviado: 24 Ago 2023 14:57
por clodoaldomonteiro
Olá Fernando.

Tem essa aqui do Quintas:

Código: Selecionar todos

   /////////////////////////////////////////////////////////////////////////////
FUNCTION ZE_Idade( dDataNasc, dDataCalc )

   LOCAL nDias, nMeses, nAnos

   If dDataCalc = NIL
      dDataCalc := Date()
   Endif

   IF Dtoc( dDataNasc ) == "  /  /  "
      RETURN 0
   ENDIF
   nAnos := Year( dDataCalc ) - Year( dDataNasc )
   IF Substr( Dtos( dDataCalc ), 5 ) < Substr( Dtos( dDataNasc ), 5 )
      nAnos := nAnos - 1
   ENDIF
   nMeses := ( 12 - Month( dDataNasc ) ) + Month( dDataCalc )
   DO CASE
   CASE Day( dDataCalc ) = Day( dDataNasc )
      nDias := 0
   CASE Day( dDataCalc ) < Day( dDataNasc )
      nMeses := nMeses - 1
      nDias  := Day( Last_Day( dDataNasc ) ) - Day( dDataNasc ) + Day( dDataCalc )
   OTHERWISE
      nDias := Day( dDataCalc ) - Day( dDataNasc )
   ENDCASE
   nMeses = Mod( nMeses, 12 )

   RETURN { nAnos, nMeses, nDias }

FUNCTION Last_Day( dData )

   dData += ( 40 - Day( dData ) )
   dData -= Day( dData )

   RETURN dData

Abraços.

Rotina de idade

Enviado: 24 Ago 2023 17:57
por Softwhouse
Olá Clodoaldo,

Obrigado, essa eu já tenho, queria ver o fonte para conferir os cálculos.

Abraços

Rotina de idade

Enviado: 01 Set 2023 18:58
por Softwhouse
Alguém conseguiu resolver isso ?