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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 346
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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 346
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: 346
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: 346
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