Calcular mês determinado entre datas

Delphi

13/11/2018

Olá pessoal. Estou precisando de uma ajuda aqui no meu trabalho. O problema é o seguinte tenho duas datas (exemplo: inicio 01/07/2016 e fim 30/09/2018) tenho que saber quantos meses de JULHO existe entre essas datas.
Ivan Avelar

Ivan Avelar

Curtidas 0

Respostas

Raimundo Pereira

Raimundo Pereira

13/11/2018

 uses
  Dateutils,


  private
    { Private declarations }
  Function RQ(Data_Inicial, Data_Final:TDate; Retorno:integer):String;


Function TForm1.RQ(Data_Inicial, Data_Final:TDate; Retorno:integer):String;
Var Tipo:string;
   begin
   case Retorno of
   0: Result  := IntToStr(DaysBetween(Data_Inicial,Data_Final));
   1: Result  := IntToStr(MonthsBetween(Data_Inicial,Data_Final));
   2: Result  := IntToStr(YearsBetween(Data_Inicial,Data_Final));
   end;

   case Retorno of
   0: Tipo  := 'Dias';
   1: Tipo  := 'Meses';
   2: Tipo  := 'Anos';
   end;

   ShowMessage('A diferença entre '+Tipo+
   ' entre '+DateToStr(Data_Inicial)+' Até '+DateToStr(Data_Final)
   +' é de '+Result+' , '+ tipo);
   end;

end.

//Chamando a Function
procedure TForm1.Button1Click(Sender: TObject);
begin
//Chama a função e retorna a quantidade de dias
RQ(DateTimePicker1.Date,DateTimePicker2.Date,0);

//Chama a função e retorna a quantidade de meses
RQ(DateTimePicker1.Date,DateTimePicker2.Date,1);

//Chama a função e retorna a quantidade de anos
RQ(DateTimePicker1.Date,DateTimePicker2.Date,2);
end;


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

13/11/2018

uma forma tosca:
const 
  MesSingularPlural: array[boolean] of string = ('mês', 'meses');
var
  DataAtual: TDateTime;
  aDatas: array of TDateTime;
  Mensagem: TString;
begin
  // aqui suponho que DataInicial e DataFinal já estão preenchidas com os valores desejados
  Mensagem := 'No período entre ' + DateToStr( DataInicial ) + ' e ' + DateToStr( DataFinal );

  DataAtual := DataInicial;
  while DataAtual <= DataFinal
  begin
    if MonthOf( DataAtual ) = 7 then
    begin
      SetLength( aDatas, Length(aDatas)+1 );
      aDatas[High(aDatas)] := DataAtual
    end;

	if DataAtual = DataFinal then exit;

    DataAtual := StartOfTheMonth( EndOfTheMonth( DataAtual ) + 1 );
    if DataAtual > DataFinal then
      DataAtual := DataFinal;
  end;

  if Length(aDatas) = 0 then
    // monta a mensagem pertinente
    Mensagem := Mensagem + ' não há mês de JULHO'
  else
    // monta a mensagem informando quantos meses de JULHO foram encontrados
    Mensagem := Mensagem + ' há ' + Trim( IntToStr( Length(aDatas) ) ) + ' ' + MesSingularPlural[Length(aDatas)>1] + ' de JULHO';

  MessageBox('Resultado', PChar(Mensagem));
end;
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

13/11/2018

uma forma tosca:
const 
  MesSingularPlural: array[boolean] of string = ('mês', 'meses');
var
  DataAtual: TDateTime;
  aDatas: array of TDateTime;
  Mensagem: TString;
begin
  // aqui suponho que DataInicial e DataFinal já estão preenchidas com os valores desejados
  Mensagem := 'No período entre ' + DateToStr( DataInicial ) + ' e ' + DateToStr( DataFinal );

  DataAtual := DataInicial;
  while DataAtual <= DataFinal
  begin
    if MonthOf( DataAtual ) = 7 then
    begin
      SetLength( aDatas, Length(aDatas)+1 );
      aDatas[High(aDatas)] := DataAtual
    end;

	if DataAtual = DataFinal then exit;

    DataAtual := StartOfTheMonth( EndOfTheMonth( DataAtual ) + 1 );
    if DataAtual > DataFinal then
      DataAtual := DataFinal;
  end;

  if Length(aDatas) = 0 then
    // monta a mensagem pertinente
    Mensagem := Mensagem + ' não há mês de JULHO'
  else
    // monta a mensagem informando quantos meses de JULHO foram encontrados
    Mensagem := Mensagem + ' há ' + Trim( IntToStr( Length(aDatas) ) ) + ' ' + MesSingularPlural[Length(aDatas)>1] + ' de JULHO';

  MessageBox('Resultado', PChar(Mensagem));
end;

GOSTEI 0
Natanael Ferreira

Natanael Ferreira

13/11/2018

Mais uma opção rsrs:

Função:

function ContaMesEspecifico(Inicio, Fim: TDate; Mes: Integer): Integer;
var
  count: Integer;
begin
  count := 0;

  Inicio := StrToDate('01/' + IntToStr(MonthOf(Inicio)) + '/' + IntToStr(YearOf(Inicio)));
  Fim := StrToDate('02/' + IntToStr(MonthOf(Fim)) + '/' + IntToStr(YearOf(Fim)));

  while (Inicio < Fim) do
  begin
    if MonthOf(Inicio) = Mes then
      Inc(count);
    Inicio := IncMonth(Inicio);
  end;

  Result := count;
end;


Exemplo de uso, com DateTimePicker para informar as datas do intervalo:

ShowMessage(IntToStr(ContaMesEspecifico(DateTimePicker1.Date, DateTimePicker2.Date, 7)) + ' meses de Julho');

GOSTEI 0
POSTAR