1

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

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

それは正常に動作します。しかし、DBNavigator の [更新] ボタンを押すたびに、この計算フィールドの結果が間違ったものになります。たとえば、通常、Age 列に 7 が表示されている場合、更新を押すと 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 =正午など)。したがって、2日間の違いを知りたい場合は、日数の違いを取得します...年数については、これを1年の日数で割ります。

編集

ここでのもう1つのオプションは、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;
于 2009-12-08T17:40:26.693 に答える
1

以前のコメントでテストを行いましたが、同じエラーもあります。

ナビゲーターかジェットのバグだと思います。

ナビのリフレッシュを押すと。表示されている 40149 は、計算されたものを含まない double としての日付表現です。見つかった最初の列のみを使用して表示しているようです。

文字列にキャストしようとすると、表示されるデータはまだ日時です。

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 に答える
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 に答える