Delphi 2007でfirebirdのタイムスタンプフィールドからミリ秒値を取得する方法
-
07-07-2019 - |
質問
Firebirdデータベース(サーバーバージョン2.1.3で実行)があり、DBExpressオブジェクトを使用して(Interbaseドライバーを使用して)Delphi 2007で接続しています
データベース内のテーブルの1つは次のようになります
CREATE TABLE MYTABLE
(
MYDATE Timestamp NOT NULL,
MYINDEX Integer NOT NULL,
...
Snip
...
PRIMARY KEY (MYDATE ,MYINDEX)
);
テーブルに追加しても問題ありません。FlameRobinでは、タイムスタンプフィールドにミリ秒の値が表示されます。
しかし、テーブルですべて選択( select * from MYTABLE
)を行うと、常に000として返されるため、ミリ秒の値を取得できません。
これは主キーの一部であるため、大きな問題を引き起こします(残念ながら、テーブルを設計しておらず、変更する権限もありません)。
ミリ秒の値を取得するために次のことを試しました:
sql1.fieldbyname('MYDATE').AsDateTime;
sql1.fieldbyname('MYDATE').AsSQLTimeStamp;
sql1.fieldbyname('MYDATE').AsStirng;
sql1.fieldbyname('MYDATE').AsFloat;
ただし、フォーマットすると、すべて14/09/2009 14:25:06.000が返されます。
タイムスタンプからミリ秒を取得するにはどうすればよいですか
更新: これが将来誰にも役立つ場合に備えて、DBExpressで試したドライバーとその結果を次に示します。
- Embarcadero-dbExpressドライバー Firebird (Delphi 2010 試用版)-ミリ秒はタイムスタンプでサポートされていません。
- Chau Chee Yang's-dbExpress Firebird用ドライバー(Delphi 2007)-タイムスタンプでミリ秒がサポートされていません。
- UpScene-InterXpress Firebird向け(Delphi 2007)-タイムスタンプでミリ秒がサポートされています。
- DevArt-dbExpressドライバー InterBase (Delphi 2007)-タイムスタンプでミリ秒がサポートされています。
解決
Firebirdが実際にミリ秒をサポートするかどうかはわかりませんが、Delphi 2007のInterBaseドライバーがサポートしないことは事実です。これは、InterBaseがC APIでミリ秒を返さないためです。 InterBaseはDateTimesをミリ秒未満の精度で保存しますが、InterBase APIはミリ秒フィールドを含まないC TM構造体で時刻を返します。したがって、InterBase用に設計されたdbExpressドライバーはそれをサポートしません。そのため、Firebirdが実際にこれを完全にサポートしていると仮定して、少なくともドライバーを変更する必要があります。
他のヒント
私の同僚( Edwin van der Kraan )がチェックした: FIBplus !
彼は、FIBPlusバージョン6.9.6およびFirebird 2.1.1で確認しました。
current_timestamp挿入を挿入し、 FormatDateTime( 'dd-mm-yyyy hh:nn:ss:zzz'、TestpFIBDataSetMYDATE.Value)
を使用してそれを抽出しました
その後、彼はミリ秒を含む日付と時刻を取得しました。
-jeroen
Firebird FAQ#305 は、単純なvarchar CASTを使用してこれを簡単に回避する方法を説明しています。
Firebird dbxドライバーが存在します(試すことができます):