Я предпочитаю ответ Яна Бойда, но для тех, кто настаивает на том, что YearsBetween - это путь, вот альтернатива.
Если Y является результатом YearsBetween, то правильный результат будет либо Y, либо Y + 1.Эта процедура вызывает YearsBetween и возвращает Y + 1.Затем он использует IncYear, чтобы увидеть, слишком ли велик ответ.Если это так, он возвращает Y.
Может показаться, что это проще, но за кулисами происходит гораздо больше работы.Ответ Иана Бойда - это тот, который вы должны использовать.
function AgeInCompleteYears ( const nBirthDate : tDateTime;
const nCurrentDate : tDateTime ) : integer;
begin
Result := 1 + DateUtils.YearsBetween ( nCurrentDate, nBirthDate );
if DateUtils.IncYear ( nBirthDate, Result ) > nCurrentDate then
dec ( Result );
end;