Try the following, which will return the age in days.
SELECT *, CINT(Now()-[Birth Date]) as AGE FROM TableName
For age in years use:
SELECT *, INT((Now()-[Birth Date]) / 365.242199) as AGEYRS from TableName
(note, CINT rounds, INT doesn t)
The reason that this works is that ACCESS stores its date/time in a similar method as Delphi, as a float where the integer portion is the number of days since a specific day and the fractional part as the fractional portion of that day ( 0.25 = 6 am, 0.50 = noon, etc). Thus if you want to know the differences between two days, just take the differences between the day numbers... for number of years, divide this by the number of days in a year.
EDIT
Another option here would be to create a calculated field in Delphi and perform the logic there. In your onCalculated event you would code something like the following:
procedure TForm1.ds1CalcFields(DataSet: TDataSet);
begin
DataSet.FieldByName( CALCDATE ).AsInteger :=
Trunc((Date - DataSet.FieldByName( BIRTH DATE ).AsDateTime) / 365.242199);
end;
EDIT
And yet a third method. Rather than allow the refresh to work as it currently does, override the behavior and force a close/reopen of the dataset by using the onClick of the navigator:
procedure TForm1.dbnvgr1Click(Sender: TObject; Button: TNavigateBtn);
begin
if Button = nbRefresh then
begin
ds1.Close;
ds1.Open;
end;
end;