Calculo do intervalo de dias entre 2 datas

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Jorge
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 24 Nov 2009 23:20
Localização: Curitiba

Calculo do intervalo de dias entre 2 datas

Mensagem por Jorge »

Olá pessoal, procurei aqui mas não achei nada parecido. Estou precisando de uma rotina onde através de 2 datas, me retorne a quantidade de dias por mês. Exemplo 1: data 1 - 12/05/2011 data 2 05/06/2011. Para o resultado eu teria que ter 12 dias no mês 05 e 05 dias no mês 06; Exemplo 2: data 1 - 15/03/2011 data 2 04/05/2011. Para esse resultado teria que ser obtido 16 dias no mês 03, 30 dias no mes 04 e 4 dias no mes 05 e assim sucessivamente. Essas datas são dados já gravados num banco de dados (1) onde existem os campos data 1 e data 2 e devem ser repassados ao banco de dados 2 pelas quantidades de dias. Uso o Clipper 5.2e. Aguardo quem puder me ajudar. Abraços.

ficaria assim:
Estrtutura
Banco de dados 1 Banco de dados 2
codigo data 1 data 2 codigo qtde dias mes_referencia
123 15/03/2011 04/05/2011 123 16 03/2011
456 12/05/2011 05/06/2011 123 30 04/2011
123 04 05/2011
456 19 05/2011
456 05 06/2011
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Calculo do intervalo de dias entre 2 datas

Mensagem por Pablo César »

Não entendí muito bem o que você precisa. Você diz que neste período de datas:

12/05/2011 x 05/06/2011 - Tem 12 dias na 1ª data e 05 dias nas segunda. Até aí OK, seria questão de pegar os dias

No entanto neste outro período você diz:

15/03/2011 x 04/05/2011 - Você diz que tem 16 dias na primeira data (por quê ??) e 04 na segunda
Jorge escreveu:Estou precisando de uma rotina onde através de 2 datas, me retorne a quantidade de dias por mês.
Você está precisando saber quantos dias tem entre a 1ª data e a segunda ?
Ou a quantidade de dias que tem no mês da primeira data e quantidade de dias que tem no mês da segunda data ?
Poderia explicar melhor ?
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Calculo do intervalo de dias entre 2 datas

Mensagem por Pablo César »

Veja se é isto que você precisa.

Código: Selecionar todos

SET DATE TO BRITISH
SET CENTURY ON

dDta1:=CTOD("")
dDta2:=CTOD("")
CLS
@ 12,00 SAY "1¦ Data" GET dDta1 VALID !EMPTY(dDta1)
@ 12,20 SAY "2¦ Data" GET dDta2 VALID !EMPTY(dDta2)
READ
IF !(LASTKEY()=27)
   aDias:=CONTADIAS(dDta1,dDta2)
   ? "N§ dias at‚ terminar o mˆs anterior da segunda data: "+ALLTRIM(STR(aDias[1]))
   ? "N§ dias do mˆs da segunda data: "+ALLTRIM(STR(aDias[2]))
ENDIF

FUNCTION CONTADIAS(dDta1,dDta2)
Local aDias:={}
IF dDta2<dDta1
   ALERT("Segunda data mais antiga que a primeira !")
   QUIT
ENDIF
nDias:=0
// Primeiro dia do mes da 2¦ data
dDta3:=CTOD("01/"+STRZERO(MONTH(dDta2),2,0)+"/"+STRZERO(YEAR(dDta2),4,0))
FOR nD=dDta1 TO dDta2
    IF nD=dDta3
       AADD(aDias,nDias)
       nDias:=0
    ENDIF
    nDias:=nDias+1
NEXT
AADD(aDias,nDias)
RETURN aDias
Compile e veja se é este o resultado para contar número de dias.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Calculo do intervalo de dias entre 2 datas

Mensagem por Jairo Maia »

Olá Jorge,

Fiquei confuso quanto a salvar. Adaptei uma função que uso para estes casos, veja também se atende:

Código: Selecionar todos

Set Date Brit
Set Century On

Grava_dias( Codigo, dData_Inicio, dData_Final )

Function Grava_Dias( xCodigo, dData_Ini, dData_Fim )
Local i, nQtd_Dias:=0, nQual_Mes:=Month( dData_Ini )
Local dFim_Check:=dData_Ini
Local cAlias:=Alias()
Sele Banco_De_Dados_2
While ( dFim_Check < dData_Fim )
 If Month( dFim_Check ) # ( nQual_Mes )
  Append Blank
  Replace Codigo With xCodigo
  Replace Qtd_Dias With nQtd_Dias
  Replace Mes_De_Referencia With Right( DToC( dData_Ini ), 7 )
  nQtd_Dias:=0
  nQual_Mes:=Month( dFim_Check )
 EndIf
 nQtd_Dias++
 dFim_Check++
 If ( dFim_Check = dData_Fim )
  nQtd_Dias:=Day( dData_Fim )
  Append Blank
  Replace Codigo With xCodigo
  Replace Qtd_Dias With nQtd_Dias
  Replace Mes_De_Referencia With Right( DToC( dData_Ini ), 7 )
  Exit
 Endi
EndDo
Sele cAlias
Retu Nil
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
sambomb
Usuário Nível 3
Usuário Nível 3
Mensagens: 250
Registrado em: 24 Out 2008 17:02
Localização: Itaocara - RJ - Brasil

Calculo do intervalo de dias entre 2 datas

Mensagem por sambomb »

Não seria apenas:

dDataInicial := ctod("01/01/2011")
dDataFinal := ctod("11/01/2011")
nDias := dDataFinal - dDataInicial

?nDias //10
Imagem

Rca Sistemas - Itaocara - RJ
anacatacombs
Membro Master
Membro Master
Mensagens: 472
Registrado em: 12 Jul 2005 16:53
Localização: Cianorte-Paraná
Contato:

Calculo do intervalo de dias entre 2 datas

Mensagem por anacatacombs »

sambomb escreveu:Não seria apenas:

dDataInicial := ctod("01/01/2011")
dDataFinal := ctod("11/01/2011")
nDias := dDataFinal - dDataInicial
Creio que não. O Colega precisa saber a quantidade de dias, separadas por mês, pelo que eu entendi: Por exemplo:
22/06/2011 e 22-07/2011:
Mês 06: 08 dias
Mês 07: 22 dias
Eros
Usuário Nível 3
Usuário Nível 3
Mensagens: 291
Registrado em: 19 Dez 2008 19:23
Localização: Goiania

Calculo do intervalo de dias entre 2 datas

Mensagem por Eros »

Se eu entendi bem sua função, vc precisa saber o prazo de dias restante no mes atual e depois os dias no mes seguinte. Nesse caso, é uma função com dois calculos.

1- Vc precisa de verificar se o mes atual do calculo é de 28, 29, 30 ou 31 dias. Apos verificar isso, deduza o dia final do mes da data inicial do calculo.

2- Depois faça o segundo calculo do mes seguinte. O principio da ideia é facilimo, a função é facil, porém nao vejo como fazer certinho sem os dois calculos, se for do jeito que vc requer.

Por exemplo:

Data do calculo: 15/06/2011 - Lastday(Date()) - Data inicial = Dias do mes atual

E assim sucessivamente....

Veja a função para verificar o ultimo dia do mes....

Código: Selecionar todos

*/--------------------------------------------------------------------------/
Function DUltimo( x )
Return   LastDay( Left( x, 2 ) , right( x , 2 ) )
*/--------------------------------------------------------------------------/
Function   LastDay( Lmes , Lano )
Local      La , Ldia

For La = 31 To 28 Step -1

    Ldia := Ctod( StrZero( La   ) +;
                  "/"             +;
                  StrZero( Lmes ) +;
                  "/"             +;
                  StrZero( Lano )  )

     If ! Empty( Ldia )
         Return StrZero( La )
    End

Next
*/--------------------------------------------------------------------------/
Espero que tenha ficado facil a compreensao.. tenho muitas funções dessas, na forma de lib, se te ajudar, estao a sua disposição.
Editado pela última vez por Maligno em 22 Jun 2011 20:01, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Avatar do usuário
billy1943
Usuário Nível 4
Usuário Nível 4
Mensagens: 570
Registrado em: 12 Mai 2009 17:33
Localização: Bauru-SP

Calculo do intervalo de dias entre 2 datas

Mensagem por billy1943 »

Vou colocar meu pensamento:
Exemplo de duas datas com muitos dias entre elas:
Data1 : 22/06/2011
Data2 : 15/11/2011

Raciocínio:

Vai sempre pegando a data final de cada mês dentro do intervalo total:
Elas serão: 30/06/2011, 31/07/2011, 31/08/2011, 30/09/2011 e 31/10/2011
No primeiro intervalo é a data final do mês menos a data inicial;
Nos meses seguintes é a data final do mês menos a data final do mês anterior e assim sucessivamente;
No último intervalo é a data final menos a data final do mês anterior;

Operacionalização:
colocar as datas em matrizes que serão no exemplo, 7 (sete) ao todo, sendo cinco para as datas fim de mês e duas paras as datas inicial e final;

Primeiro intervalo = (30/06/2011 - 22/06/2011) = 8 dias de junho

Segundo intervalo = (31/07/2011 - 30/06/2011) = 31 dias de julho

Terceiro intervalo = (31/08/2011 - 31/07/2011) = 31 dias de agosto

Quarto intervalo = (30/09/2011 - 31/08/2011) = 30 dias de setembro

Quinto intervalo = (31/10/2011 - 30/09/2011) = 31 dias de outubro

Último intervalo = (15/11/2011 - 31/10/2011) = 15 dias de novembro

Total intervalo prova = (15/11/2011 - 22/06/2011) = 146 dias
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Calculo do intervalo de dias entre 2 datas

Mensagem por Pablo César »

Não entendí a sua colocação Billy.
Sempre é assim, é só suposição, até omomento que o autor expresse a sua real necessidade.
Se for como Ana disse, então é só adaptar o meu primeiro código/exemplo para:

Código: Selecionar todos

SET DATE TO BRITISH
SET CENTURY ON

dDta1:=CTOD("")
dDta2:=CTOD("")
CLS
@ 12,00 SAY "1¦ Data" GET dDta1 VALID !EMPTY(dDta1)
@ 12,20 SAY "2¦ Data" GET dDta2 VALID !EMPTY(dDta2)
READ
IF !(LASTKEY()=27)
   aDias:=CONTADIAS(dDta1,dDta2)
   nSoma:=0
   FOR I=1 TO LEN(aDias)
       ? aDias[I]
       nSoma:=nSoma+aDias[I]
   NEXT
   ? "Total do periodo "+STR(dDta2-dDta1)
   ? "Total da soma    "+STR(nSoma)
ENDIF

FUNCTION CONTADIAS(dDta1,dDta2)
Local aDias:={}
IF dDta2<dDta1
   ALERT("Segunda data mais antiga que a primeira !")
   QUIT
ENDIF
nDias:=0
nM:=Month(dDta1)
FOR nD=dDta1 TO dDta2
    IF !(MONTH(nD)=nM)
       AADD(aDias,nDias)
       nM:=Month(nD)
       nDias:=0
    ENDIF
    nDias:=nDias+1
NEXT
AADD(aDias,nDias)
RETURN aDias
Varrer as data dia por dia, parece ser impensável, mas para o processamento eletrônico tira de fichinha... vale a pena seguir essa linha. Daí seja como Billy ou Ana falou, pode-se adaptar o código.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Jorge
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 24 Nov 2009 23:20
Localização: Curitiba

Calculo do intervalo de dias entre 2 datas

Mensagem por Jorge »

Obrigado à todos que estão tentando me ajudar. Talvez eu não tenha sido claro ao problema. A rotina em questão seria para, buscando num banco de dados 1 onde temos <n> registros e exemplificando à seguir seria:
codigo data1 data2
123 15/03/2011 04/05/2011
Na função deveria fazer o cálculo da seguinte forma:
temos um total de 16+30+04=50 dias - até aí tudo bem pois bastaria diminuir a data2 da data1
o problema é como controlar o cálculo através dos meses?
como a função saberia que para esse registro (123), existem os meses 03,04,05?
o resultado seria adicionado num banco de dados 2, onde estariam separado os dias conforme a disposição abaixo:
codigo quantidade mes_referência
123 16 03/2011
123 30 04/2011
123 04 05/2011
Para cada mês eu teria um registro adicionado e quebrado pela quantidade de dias.
A maneira do cálculo seria: abre o banco de dados1 e faz o cálculo do primeiro registro;
Achados as quantidades por mês de referência, repassam ao banco de dados 2, volta ao banco de dados 1 e pega o próximo registro para o cálculo seguinte, seguindo essa ordem.
Espero ter exposto melhor a situação, agradecendo desde já a possível solução.
Eros
Usuário Nível 3
Usuário Nível 3
Mensagens: 291
Registrado em: 19 Dez 2008 19:23
Localização: Goiania

Calculo do intervalo de dias entre 2 datas

Mensagem por Eros »

Ola amigo,

Todas as sugestões que lhe foram repassadas permitem perfeitamente que voce consiga antigir o objetivo desejado.

Foram apresentadas excelentes ideias, agora cabe-lhe analisar a melhor estratégia e realizar a operação.

Boa sorte
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Calculo do intervalo de dias entre 2 datas

Mensagem por Jairo Maia »

Olá Jorge,

Testei o exemplo que postei e fiz a correção de dois erros:
1- o primeiro mês somava 1 dia a mais
2- a data de referência era sempre o mês/ano da data inicial.

Acrescentei também a idéia de como vc varrer o primeiro arquivo, e gravar os dados no segundo. Para não repetir o código, coloquei como anexo.

Porém, como o Eros disse, a solução foi dada, agora, escolha um exemplo, seja o meu, o do Pablo, ou outro, e faça as adaptações, e reporte o problema sobre o exemplo para que possamos continuar a ajudar.

O exemplo com bancos de dados está em anexo, mas se vc compilar o exemplo abaixo, vc terá na tela exatamente o resultado do seu ultimo post:

Código: Selecionar todos

Set Date Brit
Set Century On

Grava_dias( 123, CToD("15/03/2011"), CToD("04/05/2011") )

Function Grava_Dias( xCodigo, dData_Ini, dData_Fim )
Local i, nQtd_Dias:=0, nQual_Mes:=Month( dData_Ini )
Local dFim_Check:=dData_Ini, lPri_mes:=.t.
While ( dFim_Check < dData_Fim )
 If Month( dFim_Check ) # ( nQual_Mes )
  nQtd_Dias:=If(lPri_mes, nQtd_Dias-1, nQtd_Dias)
  ? Str( xCodigo ) + " " + Str( nQtd_Dias ) + " " + Right( DToC( dFim_Check-1 ), 7 )
  lPri_mes:=.f.
  nQtd_Dias:=0
  nQual_Mes:=Month( dFim_Check )
 EndIf
 nQtd_Dias++
 dFim_Check++
 If ( dFim_Check = dData_Fim )
  nQtd_Dias:=Day( dData_Fim )
  ? Str( xCodigo ) + " " + Str( nQtd_Dias ) + " " + Right( DToC( dFim_Check ), 7 )
  Exit
 Endi
EndDo
Retu Nil
______________________________
Olá Jorge,
Editei este post em 24/06/2011 às 10h37, para correção na linha 12 (dFim_Check - 1), e troquei o arquivo anexo, pelo já corrigido.
______________________________
Anexos
DATA.PRG
(1.01 KiB) Baixado 304 vezes
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Jorge
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 24 Nov 2009 23:20
Localização: Curitiba

Calculo do intervalo de dias entre 2 datas

Mensagem por Jorge »

Agradeço imensamente aos que me sugeriram soluções e que vou testar assim que eu resolver alguns problemas de ordem pessoal e coloco o resultado. No momento sem tempo para concluir mas muito obrigado mesmo. Tenho certeza da grandiosidade de caráter das pessoas que aqui sempre estão a ajudar aos outros.
Responder