错误的结果刷新后压上的DBNavigator德尔福

我在这里遇到一个很奇怪的情况。 我通过JET访问数据库(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没有)

的原因,这种工作原理是,可信存储其日期/时间中的相似方法如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;

试试这个间隔参数,而不是:

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的日期表示为double没有计算的东西。 它似乎只用找到的第一列,以显示它。

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

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

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

分类:数据库 时间:2015-03-15 人气:2
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.795 (s). 10 q(s)