Как получить значение миллисекунды из поля Timestamp в Firebird с Delphi 2007 - PullRequest
4 голосов
/ 14 сентября 2009

У меня есть база данных Firebird (работает на сервере версии 2.1.3), и я подключаюсь к ней с Delphi 2007, используя объекты DBExpress (используя драйвер Interbase)

Одна из моих таблиц в базе данных выглядит примерно так

CREATE TABLE MYTABLE
(
  MYDATE Timestamp NOT NULL,
  MYINDEX Integer NOT NULL,
  ...
  Snip
  ...
  PRIMARY KEY (MYDATE ,MYINDEX)
);

Я могу добавить в таблицу ОК, и в Flame Robin оно показывает поле отметки времени как имеющее значение в миллисекундах.

Но когда я делаю выбор всех (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 при форматировании.

Как извлечь миллисекунду из отметки времени?

UPDATE: Если в будущем это кому-нибудь поможет, вот драйверы, которые я пробовал для DBExpress, и результаты.

Ответы [ 4 ]

5 голосов
/ 14 сентября 2009

Мой коллега ( Эдвин ван дер Краан ) только что проверил: он работает с FIBplus !

Он проверил с FIBPlus версии 6.9.6 и Firebird 2.1.1.

Он вставил вставку current_timestamp и извлек ее с помощью FormatDateTime('dd-mm-yyyy hh:nn:ss:zzz', TestpFIBDataSetMYDATE.Value) Затем он вернул дату и время, включая миллисекунды.

- Йерун

4 голосов
/ 14 сентября 2009

Я не знаю, поддерживает ли Firebird миллисекунды, но я точно знаю, что драйвер InterBase для Delphi 2007 этого не делает. Это связано с тем, что InterBase не возвращает миллисекунды в своем C API; хотя InterBase хранит DateTimes с точностью до миллисекунд, InterBase API возвращает время в структуре C TM, которая не содержит миллисекундное поле. Поэтому драйвер dbExpress, разработанный для InterBase, не будет поддерживать это. Таким образом, вам нужно будет как минимум изменить драйверы, предполагая, что Firebird на самом деле поддерживает это вообще.

2 голосов
/ 03 мая 2010

Firebird FAQ # 305 объясняет, как легко обойти это с помощью простого varchar CAST.

1 голос
/ 14 сентября 2009

Существуют драйверы Firebird DBX (вы можете попробовать их):

http://sites.google.com/site/dbxfirebird/ (бесплатно)

http://www.upscene.com/products.dbx.dbx_fb.php

...