質問

私はここで非常に奇妙な状況に直面しています。 私はJETを介してデータベース(MDB)にアクセスしています。私は、ユーザーのアクセスにそれを可能にするためのDBGridとDBNavigatorを使用しています。データセットは、次のクエリで、TADOQueryコンポーネントを使用して作成されます:

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

これは正常に動作します。私はDBNavigatorの[更新]ボタンを押すたびしかし、この計算フィールドの結果が間違っているとなります。例えば、通常、私は7歳の列に示されている場合、私は押した後、それは40149になりリフレッシュ 40150から40149まで、6回交換、0 40156に等7つの変化 正しい結果を表示するために、私は再び、クエリを再開する必要があります。

誰が助けることができますか?

役に立ちましたか?

解決

日で年齢を返します。これは、次のことを試してみてください。

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

年間使用されている年齢の場合:

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

(注意、CINTはINTにはない、四捨五入)

これが機能することの理由は、整数部分が特定の日からの日数と、その日の小数部分と小数部分であるfloatとして、デルファイと同様の方法でACCESSストアがその日付/時刻ということです(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;

編集

そして、さらに第3の方法。むしろそれが現在、動作をオーバーライドし、近くを強制/ナビゲーターのの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

私はあなたの以前のコメントでテストを行なったし、私も同じエラーを持っています。

私はそれがどこかナビゲータまたはジェットのバグだと思います。

あなたはNAVにリフレッシュを打つとき。示さ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

これはかなり醜いですが、それはトリックを行います..

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top