我们面临一个非常奇怪这里的情况。我访问的数据库(MDB)通过喷气式飞机。我用DBGrid和DBNavigator允许用户访问。数据集是用TADOQuery组件,与下查询:

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

它工作正常。但每当我按刷新键在DBNavigator的结果这一计算的场变得错误的。例如,如果通常我有7所示,上年龄柱之后,我按刷新它成为40149, 7变化40149,6个改变40150,0至40156等。为了查结果正确,我需要重新审查询一次。

任何人都可以帮忙吗?

有帮助吗?

解决方案

尝试下,其将返回的年龄在天。

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

对于年龄在年使用:

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

(注意,CINT轮,INT不会)

原因,这个的工作原理是,访问储存的日期/时间在一个类似的方法作为德尔斐,作为一个漂浮在整数部分是数天,因为一个特定的日期和小数部分为小数部分的那一天(0.25=6点,0.50=中午,等等)。因此如果你想知道之间的差异,两天,只需要之间的差异的一天的数字...对于数年来,除此通过的天数在一年的时间。

编辑

另一种选择,这里将是创建一个计算领域中的特尔斐和执行的逻辑。在你onCalculated事件中,你会的代码如下:

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

编辑

然而,一个第三种方法。而不是允许的刷新工作,因为它目前,复盖的行为,并强制关闭/重新打开的数据集通过使用击的导航器:

procedure TForm1.dbnvgr1Click(Sender: TObject; Button: TNavigateBtn);
begin
  if Button = nbRefresh then
    begin
      ds1.Close;
      ds1.Open;
    end;
end;

其他提示

尝试此间隔参数,而不是:

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

我与你以前的评论测试,我也有同样的错误。

我认为这是一个错误的某处在导航或在射流中。

当你点击刷新的资产净值。所示的40149是日期表示为双而不计算出的东西。它似乎只使用第一列中找到,并显示它。

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

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

当我在所计算出的字段中使用String类型或数量的列第一,结果被显示,它应。 你可以试试:

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

这是相当难看,但它确实特技..

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top