YearsBetween returns the approximate number of years between two specified TDateTime values.

Because years are not all the same length (e.g. leap years), YearsBetween returns an approximation based on an assumption of 365.25 days per year.

Fractional years are not counted, so the function will return a whole integer value only.

2023 is not a leap year. 2024 is a leap year.

For example, YearsBetween reports the difference between Jan 1st 2023 and December 31st 2023 as zero (0), and also returns the difference between Jan 1st 2024 and December 31st 2024 as zero (0) - regardless of whether a leap year is included.

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

Declaration: Function YearsBetween(const ANow: TDateTime; const AThen: TDateTime): Integer

As an example.

procedure OnMapEvent(var Value:Variant);
var
vYear, vDate : TDateTime;
vStrYear, vStrDate : string;
vBetwix : integer;
begin
//Result is 0 whole years - run-date to run-date plus 1 month
vBetwix := YearsBetween(Date, IncMonth(Date, 1));
LogInfo(IntToStr(vBetwix));
LogInfo('');
 
//Result is 0 whole years - 6 months only
vStrDate := '01-10-2023';
vStrYear := '01-04-2024';
vDate := StringToDateTime('dd/mm/yyyy',vStrDate);
vYear := StringToDateTime('dd/mm/yyyy',vStrYear);
vBetwix := YearsBetween(vDate, vYear);
LogInfo(IntToStr(vBetwix));
LogInfo('');
 
//Result is 0 whole years - 2023 is NOT a leap year
vStrDate := '01-01-2023';
vStrYear := '31-12-2023';
vDate := StringToDateTime('dd/mm/yyyy',vStrDate);
vYear := StringToDateTime('dd/mm/yyyy',vStrYear);
vBetwix := YearsBetween(vDate, vYear);
LogInfo(IntToStr(vBetwix));
LogInfo('');
 
//Result is 0 whole years - 2024 is a leap year
vStrDate := '01-01-2024';
vStrYear := '31-12-2024';
vDate := StringToDateTime('dd/mm/yyyy',vStrDate);
vYear := StringToDateTime('dd/mm/yyyy',vStrYear);
vBetwix := YearsBetween(vDate, vYear);
LogInfo(IntToStr(vBetwix));
LogInfo('');
 
//Result is 1 whole year
vStrDate := '01-01-2024';
vStrYear := '01-01-2025';
vDate := StringToDateTime('dd/mm/yyyy',vStrDate);
vYear := StringToDateTime('dd/mm/yyyy',vStrYear);
vBetwix := YearsBetween(vDate, vYear);
LogInfo(IntToStr(vBetwix));
LogInfo('');
 
//Result is 1 whole year
vStrDate := '01-01-2023';
vStrYear := '02-01-2024';
vDate := StringToDateTime('dd/mm/yyyy',vStrDate);
vYear := StringToDateTime('dd/mm/yyyy',vStrYear);
vBetwix := YearsBetween(vDate, vYear);
LogInfo(IntToStr(vBetwix));
LogInfo('');
 
//Result is 4 whole years
vStrDate := '01-01-2023';
vStrYear := '02-01-2027';
vDate := StringToDateTime('dd/mm/yyyy',vStrDate);
vYear := StringToDateTime('dd/mm/yyyy',vStrYear);
vBetwix := YearsBetween(vDate, vYear);
LogInfo(IntToStr(vBetwix));
LogInfo('');
 
end;