1

我在这里遇到了一个非常奇怪的情况。我正在通过 JET 访问数据库 (MDB)。我使用 DBGrid 和 DBNavigator 来允许用户访问它。数据集是使用 TADOQuery 组件创建的,具有以下查询:

SELECT *, (DateDiff ('y',[Birth Date], Now())) AS [Age] FROM TableName

它工作正常。但是每当我按下 DBNavigator 上的刷新按钮时,这个计算字段的结果就会出错。例如,如果通常我在 Age 列上显示 7,按 Refresh 后它变为 40149,7 变为 40149,6 变为 40150,0 变为 40156 等。为了查看正确的结果,我需要再次重新打开查询。

有人可以帮忙吗?

4

3 回答 3

4

尝试以下操作,它将以天为单位返回年龄。

SELECT *, CINT(Now()-[Birth Date]) as AGE FROM TableName

对于年龄使用:

SELECT *, INT((Now()-[Birth Date]) / 365.242199) as AGEYRS from TableName

(注意,CINT 回合,INT 没有)

这样做的原因是 ACCESS 以与 Delphi 类似的方法将其日期/时间存储为浮点数,其中整数部分是自特定日期以来的天数,小数部分是当天的小数部分( 0.25 =早上 6 点,0.50 = 中午等)。因此,如果您想知道两天之间的差异,只需计算天数之间的差异......对于年数,将其除以一年中的天数。

编辑

这里的另一个选择是在 Delphi 中创建一个计算字段并在那里执行逻辑。在您的 onCalculated 事件中,您将编写如下代码:

procedure TForm1.ds1CalcFields(DataSet: TDataSet);
begin
  DataSet.FieldByName('CALCDATE').AsInteger := 
    Trunc((Date - DataSet.FieldByName('BIRTH DATE').AsDateTime) / 365.242199);
end;

编辑

还有第三种方法。与其让刷新像当前那样工作,不如覆盖该行为并使用导航器的 onClick 强制关闭/重新打开数据集:

procedure TForm1.dbnvgr1Click(Sender: TObject; Button: TNavigateBtn);
begin
  if Button = nbRefresh then
    begin
      ds1.Close;
      ds1.Open;
    end;
end;
于 2009-12-08T17:40:26.693 回答
1

试试这个间隔参数:

SELECT *, (DateDiff ('yyyy',[Birth Date], Now())) AS [Age] FROM TableName

以下是“间隔”的含义:

yyyy    Year
q   Quarter
m   Month
y   Day of Year
d   Day
w   Weekday
ww  Week
h   Hour
n   Minute
s   Second
于 2009-12-08T14:34:29.430 回答
1

我用你之前的评论做了一个测试,我也有同样的错误。

我认为这是导航器或喷气式飞机中某处的错误。

当您在导航上点击刷新时。显示的 40149 是将日期表示为双精度,没有计算出的东西。它似乎只使用找到的第一列并显示它。

如果您尝试将其转换为字符串,则显示的数据仍然是日期时间。

Select *, ' ' & DateDiff(.......) as [Age] From table1;

当我在计算字段中首先使用字符串或数字类型的列时,结果将按应有的方式显示。你可以试试 :

SELECT *,  mid(id & (DateDiff ('y',[madate], Now())), len(id) + 1) AS [Age] FROM Table1

或者 :

SELECT *,  (id-id) + (DateDiff ('y',[madate], Now()))  AS [Age] FROM Table1

这很丑陋,但它的伎俩..

于 2009-12-08T17:08:14.687 回答