GARANTIR DESCONTO

Fórum Sobre Datas... #278242

20/04/2005

0

Pessoal, existe alguma função que me retorna a quantidade de meses entre duas datas? sei que existe a [b:9b2185940f]MonthsBetween[/b:9b2185940f], porém ´me parece´ que ela analisa a quantidade de dias entre as datas e verifica a quantidade de meses que essa quantidade comporta, exemplo se eu pegar do dia 20/02/2005 até o dia 20/04/2005 tenho 59 dias, o MonthsBetween verifica isso e retorna 1, como só dá pra fazer 1 mes ele ignora os outros 19 dias, o que eu precizo vai além disso. nesse mesmo exemplo de datas [b:9b2185940f]20/02/2005[/b:9b2185940f] até [b:9b2185940f]20/04/2005[/b:9b2185940f] temos três meses do ano de 2005 (fevereiro, março e abril) e queria que me retornase exatamente isso ao invés de 1 por ater apenas 59 dias...


Bruno Belchior

Bruno Belchior

Responder

Posts

20/04/2005

Edilcimar

o que vc pode fazer é pegar a quantidade de dias dividir por trinta e fazer o arredondamento para que 2,6 conte 3


Responder

Gostei + 0

20/04/2005

Rjun

Voce pode desenvolver uma função que receba como parametros mes inicial, ano inicial, mes final, ano final e retorna o numero de meses decorridos.


Responder

Gostei + 0

20/04/2005

Bruno Belchior

mas a idéia é passar apenas dois parâmetros do tipo [b:3b13f5b05c]TDate[/b:3b13f5b05c], [b:3b13f5b05c]DataInicial[/b:3b13f5b05c] e [b:3b13f5b05c]DataFinal[/b:3b13f5b05c]...


Responder

Gostei + 0

20/04/2005

Rjun

Tudo bem. Crie uma função que receba dois TDATE´s e dentro dela decomponha as datas em meses inicial e final e anos inicial e final e use a função que sugeri.


Responder

Gostei + 0

21/04/2005

José Henrique

function Meses(DataMaior, DataMenor : TDateTime) : integer;
//Devolve o número de meses entre DataMaior e DataMenor independente dos dias
//Exemplo: Meses(28/02/05, 01/03/05) = 2
var
  DataAtual : TDateTime;
  intMes : integer;
  var
  Ano, Mes, Dia : word;
begin
  DecodeDate(DataMenor, Ano, Mes, Dia);
  DataAtual := EncodeDate(Ano, Mes, 1);

  DecodeDate(DataMaior, Ano, Mes, Dia);
  DataMaior := EncodeDate(Ano, Mes, 1);

  intMes := 1;
  DataAtual := DataMenor;
  while (DataAtual < DataMaior) do
  begin
     Inc(intMes);
     DataAtual := IncMonth(DataAtual, 1);
  end;
  Result := intMes;
end;



Responder

Gostei + 0

21/04/2005

Marco Salles

Pessoal, existe alguma função que me retorna a quantidade de meses entre duas datas? sei que existe a MonthsBetween, porém ´me parece´ que ela analisa a quantidade de dias entre as datas e verifica a quantidade de meses que essa quantidade comporta....,


[b:e3d60b964b][color=red:e3d60b964b]Tem ate um tópico aqui no site Chamado TemBugNaFunção MonthsBetween[/color:e3d60b964b][/b:e3d60b964b]

http://forum.clubedelphi.net/viewtopic.php?t=36022&highlight=bug

P:s Infelismente a integra desse tópico , não pode ser vista , porque as mensagems postadas pelo nosso amigo Emersom.En Sumiram...
[b:e3d60b964b]
Antes as Dele do que as Minhas[/b:e3d60b964b] :lol: :lol: :lol: Brincadeirinha :P :P :P


:arrow: Amigo [b:e3d60b964b]Jose Henrique [/b:e3d60b964b], eu experimentei sua função e entre as datas
28/02/2005 e 01/03/2005 a resposta foi ZERO :cry: :cry: :cry:
:idea: Verifique se não esta faltando algo

:arrow: Bem , mas eu não entrei aqui , com este propósito. O meu propósito é outro.. Gostaria de passar para a Frente Uma Rotina Criada Pelo Nosso Amigo Emerson.En que trata Há meu Ver,[b:e3d60b964b] Muito Bem [/b:e3d60b964b]Dessas Diferenças De Datas

:arrow: Infelismente alguns Tópicos Do Emerson.En Sumiram Aqui No Forum Há Um Tempo Atrás, Felismente eu Copiei Esta Rotina

Então Segue Abaixo:


[b:e3d60b964b]Rotina Passada Pelo Amigo Emerson.En[/b:e3d60b964b]
function MesesEntreDatas(dDataInicial, dDataFinal: TDate): integer;
var
    Anosi, Mesesi, Diasi: integer;
    Anosf, Mesesf, Diasf: integer;
    Anos, Meses, Dias: Word;
begin
DecodeDate(dDataInicial,Anos,Meses,Dias);
anosi:=Anos;
Mesesi:=Meses;
DiasI:=Dias;
Decodedate(dDataFinal,Anos,Meses,Dias);
anosF:=Anos;
MesesF:=Meses;
DiasF:=Dias;
AnosF:=Abs(AnosF-AnosI);
MesesF:=(MesesF-Mesesi);
DiasF:=(DiasF-Diasi);
if MesesF < 0 Then
  begin
    Dec(AnosF);
    Inc(MesesF,12);
  end;
if DiasF < 0 then
   Dec(MesesF);
Result :=abs(MesesF + (AnosF * 12));
end;


Para Chamar a Função Faça:
procedure TForm1.Button2Click(Sender: TObject);
var
DataInicial,DataFinal:TDate;
begin
datainicial:=StrToDate(´28/02/2005´);
dataFinal:=StrToDate(´01/03/2005´);
Showmessage(IntToStr(Meses(DataInicial, DataFinal)));
end;


Faça vários teste e nos comunique :arrow:


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar