GARANTIR DESCONTO

Fórum achar a quantidade de meses #205597

10/01/2004

0

preciso achar a quantidade de meses entre duas datas. Ex.: 10/10/2004 - 25/11/2003 = 2 meses, não importa a quantidade de dias.


Darrier Marques

Darrier Marques

Responder

Posts

11/01/2004

Fabio.hc

[b:c8b542fb5f]Como retornar quantidade de dias meses e anos entre duas datas[/b:c8b542fb5f]
Procedure EntreDatas(DataFinal,DataInicial : TDate ; var Anos,Meses,Dias : Integer) ;
//
// Retorna a diferença em Dias,Meses e Anos entre 2 datas
//
  Function Calcula(Periodo : Integer) : Integer ;
  var
     intCont : Integer ;
  begin
    intCont := 0 ;
    Repeat
    Inc(intCont) ;
    DataFinal := IncMonth(DataFinal,Periodo * -1) ;
    Until DataFinal < DataInicial ;
    DataFinal := IncMonth(DataFinal,Periodo) ;
    Inc(intCont,-1) ;
    Result := intCont ;
  End ;
begin
  if DataFinal <= DataInicial then 
  begin
    Anos := 0 ;
    Meses := 0 ;
    Dias := 0 ;
    exit ;
  end;
  Anos := Calcula(12) ;
  Meses := Calcula(1) ;
  Dias := Round(DataFinal - DataInicial) ;
end;



Responder

Gostei + 0

11/01/2004

Crash

Você pode usar a função IncMonth. Ela incrementa na data um mês.

function MonthCount(Data1, Data2: TDate): Integer;
var
  Dia, Mes, Ano: Word;
  vData: TDate;
  vMes1, vMes2: String;
  I: Integer;
begin
  I:= 0;
  DecodeDate(Data1, Ano, Mes, Dia);
  vMes1:= IntToStr(Mes) + ´/´ + IntToStr(Ano);
  DecodeDate(Data2, Ano, Mes, Dia);
  vMes2:= IntToStr(Mes) + ´/´ + IntToStr(Ano);
  vData:= Data1;
  while vMes1 <> vMes2 do
  begin
    IncMonth(vData);
    DecodeDate(vData, Ano, Mes, Dia);
    vMes1:= IntToStr(Mes) + ´/´ + IntToStr(Ano);
    Inc(I);
  end;
  MonthCount:= I;
end;



Responder

Gostei + 0

11/01/2004

Wolverine

procedure TForm1.Button1Click(Sender: TObject);
var
datatotainicial,datatotafinal:string;
mesini,mesfin,mes,anoini,anofin,ano,cont,cont1,I:integer;
begin
datatotainicial:=MaskEdit1.Text; //sendo 02/02/2004
datatotafinal:=MaskEdit2.Text;
mesini:=strtoint(copy (datatotainicial,4,2));
mesfin:=strtoint(copy (datatotafinal,4,2));
anoini:=strtoint(copy (datatotainicial,7,4));
anofin:=strtoint(copy (datatotafinal,7,4));
mes:=0;
ano:=0;
// um if para saber se o funcionário ficou mais de um ano na empresa
if anoini<anofin then
begin
// este for é para contar(cont) quantos anos e adicionar 12(cont1)x quantidade(cont) em mêses
for I:=anoini to anofin do
begin
cont:=cont+1;
cont1:=cont1+12;
end;
mesini:=12-mesini;
mes:=((mesini+mesfin+cont1)-24);
end;
// este if é para saber se ele ficou até um ano
if anoini=anofin then
begin
mesini:=12-mesini;
mesfin:=12-mesfin;
mes:=(mesini-mesfin);
end;
//vc deve verificar se a dataini é maior q a datafin
//estes if´s são para fazer consistência nas datas
if anoini > anofin then
begin
ShowMessage(´A data de admissão é maior q a data de demissão!´);
Abort;
end;
if (mesini < 0) or (mesfin > 13) then
begin
ShowMessage(´Mês de admissão invalido´);
Abort;
end;
if (mesini < 0) or (mesfin > 13) then
begin
ShowMessage(´Mês de demissão invalido´);
Abort;
end;
if anoini = anofin then
if mesini < mesfin then
begin
ShowMessage(´Mês de admissão é maior que o Mês de demissão ´);
Abort;
end;
ShowMessage(IntToStr(mes));
end;


Responder

Gostei + 0

11/01/2004

Jax

Eu tenho uma sugestão que utiliza menos código...

Declare:

Uses
DateUtils;

procedure TForm1.Button1Click(Sender: TObject);
var
D1, D2: TDateTime;
R : Integer;
begin
D1 := StrToDate(´10/01/2001´);
D2 := StrToDate(´23/04/2001´);
R := MonthsBetween(D1, D2);
Label1.Caption := Format(´Meses entre as dusa datas: ¬d´, [R]);
end;

O calculo é feito com base no dia do mês considerando que um mês tem 30 dias.

Espero ter ajudado.


Responder

Gostei + 0

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

Aceitar