The MonthSpan function returns the approximate number of months between two specified TDateTime values, including any fraction of a month.

Because months are not all the same length, MonthSpan returns an approximation based on an assumption of 30.4375 days per month.

But unlike its sister function MonthsBetween, the MonthSpan function reports incomplete months as a fraction of the entire 30.4375-day month.

The ordering of the two dates doesn't matter - the number of months will not be a negative value.

Declaration: function MonthSpan(const ANow, AThen: TDateTime): Double;

The following example shows several scenarios.

procedure OnMapEvent(var Value:Variant);
var
vYearT, vDate : TDateTime;
vStrYear, vStrDate : string;
vBetwix : double;
begin
//Result is 1.01848049281314 of a month - run-date to run-date plus 1 month
//Where run-date is 03-12-2023 plus 31 days (31/30.4375 = 1.01848049281314
vBetwix := MonthSpan(Date, IncMonth(Date, 1));
LogInfo(FloatToStr(vBetwix));
 
//Result is 3.31827515400411 months - 101 days
vBetwix := MonthSpan(Date, IncDay(Date, 101));
LogInfo(FloatToStr(vBetwix));
 
//Result is 26.9733059548255 months - 821 days
vBetwix := MonthSpan(Date, IncMonth(Date, 27));
LogInfo(FloatToStr(vBetwix));
 
//Result is 6.0123203285421 months - 183 days
vStrDate := '01-10-2023';
vStrYear := '01-04-2024';
vDate := StringToDateTime('dd/mm/yyyy',vStrDate);
vYearT := StringToDateTime('dd/mm/yyyy',vStrYear);
vBetwix := MonthSpan(vDate, vYearT);
LogInfo(FloatToStr(vBetwix));
 
//Result is 11.958932238193 months - 364 days
vStrDate := '01-01-2023';
vStrYear := '31-12-2023';
vDate := StringToDateTime('dd/mm/yyyy',vStrDate);
vYearT := StringToDateTime('dd/mm/yyyy',vStrYear);
vBetwix := MonthSpan(vDate, vYearT);
LogInfo(FloatToStr(vBetwix));
 
//Result is 12.0246406570842 months - 366 days
vStrDate := '01-01-2024';
vStrYear := '01-01-2025';
vDate := StringToDateTime('dd/mm/yyyy',vStrDate);
vYearT := StringToDateTime('dd/mm/yyyy',vStrYear);
vBetwix := MonthSpan(vDate, vYearT);
LogInfo(FloatToStr(vBetwix));
 
//Result is 12.7802874743326 months - 389 days
vStrDate := '01-01-2023';
vStrYear := '25-01-2024';
vDate := StringToDateTime('dd/mm/yyyy',vStrDate);
vYearT := StringToDateTime('dd/mm/yyyy',vStrYear);
vBetwix := MonthSpan(vDate, vYearT);
LogInfo(FloatToStr(vBetwix));
 
//Result is 50.7268993839836 months - 1544 days
vStrDate := '01-01-2023';
vStrYear := '25-03-2027';
vDate := StringToDateTime('dd/mm/yyyy',vStrDate);
vYearT := StringToDateTime('dd/mm/yyyy',vStrYear);
vBetwix := MonthSpan(vDate, vYearT);
LogInfo(FloatToStr(vBetwix));
 
//Result is 0.788501026694045 months - 24 days
vStrDate := '01-01-2023';
vStrYear := '25-01-2023';
vDate := StringToDateTime('dd/mm/yyyy',vStrDate);
vYearT := StringToDateTime('dd/mm/yyyy',vStrYear);
vBetwix := MonthSpan(vDate, vYearT);
LogInfo(FloatToStr(vBetwix));
end;