错误的结果之后刷新压在DbNavigator德尔福
-
18-09-2019 - |
题
我们面临一个非常奇怪这里的情况。我访问的数据库(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
这是相当难看,但它确实特技..