Calculo do intervalo de dias entre 2 datas
Moderador: Moderadores
Calculo do intervalo de dias entre 2 datas
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
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
- Pablo César
- 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
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
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 ?
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
Você está precisando saber quantos dias tem entre a 1ª data e a segunda ?Jorge escreveu:Estou precisando de uma rotina onde através de 2 datas, me retorne a quantidade de dias por mês.
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.
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.
- Pablo César
- 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
Veja se é isto que você precisa.
Compile e veja se é este o resultado para contar número de dias.
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 aDiasUm 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.
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.
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Calculo do intervalo de dias entre 2 datas
Olá Jorge,
Fiquei confuso quanto a salvar. Adaptei uma função que uso para estes casos, veja também se atende:
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 NilAbraç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)
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

- Mensagens: 250
- Registrado em: 24 Out 2008 17:02
- Localização: Itaocara - RJ - Brasil
Calculo do intervalo de dias entre 2 datas
Não seria apenas:
dDataInicial := ctod("01/01/2011")
dDataFinal := ctod("11/01/2011")
nDias := dDataFinal - dDataInicial
?nDias //10
dDataInicial := ctod("01/01/2011")
dDataFinal := ctod("11/01/2011")
nDias := dDataFinal - dDataInicial
?nDias //10

Rca Sistemas - Itaocara - RJ
-
anacatacombs
- Membro Master

- Mensagens: 472
- Registrado em: 12 Jul 2005 16:53
- Localização: Cianorte-Paraná
- Contato:
Calculo do intervalo de dias entre 2 datas
Creio que não. O Colega precisa saber a quantidade de dias, separadas por mês, pelo que eu entendi: Por exemplo:sambomb escreveu:Não seria apenas:
dDataInicial := ctod("01/01/2011")
dDataFinal := ctod("11/01/2011")
nDias := dDataFinal - dDataInicial
22/06/2011 e 22-07/2011:
Mês 06: 08 dias
Mês 07: 22 dias
Calculo do intervalo de dias entre 2 datas
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....
Espero que tenha ficado facil a compreensao.. tenho muitas funções dessas, na forma de lib, se te ajudar, estao a sua disposição.
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
*/--------------------------------------------------------------------------/
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
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
Calculo do intervalo de dias entre 2 datas
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
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.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
- Pablo César
- 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
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: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.
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 aDiasUm 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.
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.
Calculo do intervalo de dias entre 2 datas
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.
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.
Calculo do intervalo de dias entre 2 datas
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
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
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Calculo do intervalo de dias entre 2 datas
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:
______________________________
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.
______________________________
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 NilOlá 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 305 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)
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)
Calculo do intervalo de dias entre 2 datas
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.

