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
Rotina de idade
Enviado: 03 Mar 2023 18:52
por JoséQuintas
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 ?