Rotina de idade

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Rotina de idade

Mensagem 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 ?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Rotina de idade

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Rotina de idade

Mensagem 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!!!
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Softwhouse
Usuário Nível 3
Usuário Nível 3
Mensagens: 324
Registrado em: 07 Dez 2011 18:44
Localização: Porto Alegre/RS

Rotina de idade

Mensagem por Softwhouse »

Melhor é consertar isso.
Fernando
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Rotina de idade

Mensagem 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
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Rotina de idade

Mensagem por Vlademiro »

Complementando...

Código: Selecionar todos

Add 1 month to 2020-01-31 ---> 2020-02-29
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Rotina de idade

Mensagem por JoséQuintas »

dates.png
Uma comparação entre as duas rotinas.
Destaquei aonde a diferença está maior.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Rotina de idade

Mensagem 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á...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Softwhouse
Usuário Nível 3
Usuário Nível 3
Mensagens: 324
Registrado em: 07 Dez 2011 18:44
Localização: Porto Alegre/RS

Rotina de idade

Mensagem por Softwhouse »

Olá Quintas,
Vc consegue o código fonte da outra rotina ?
Fernando
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Rotina de idade

Mensagem 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.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Softwhouse
Usuário Nível 3
Usuário Nível 3
Mensagens: 324
Registrado em: 07 Dez 2011 18:44
Localização: Porto Alegre/RS

Rotina de idade

Mensagem por Softwhouse »

Olá Clodoaldo,

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

Abraços
Fernando
Softwhouse
Usuário Nível 3
Usuário Nível 3
Mensagens: 324
Registrado em: 07 Dez 2011 18:44
Localização: Porto Alegre/RS

Rotina de idade

Mensagem por Softwhouse »

Alguém conseguiu resolver isso ?
Fernando
Responder