Come ottenere il valore in millisecondi da un campo Timestamp in firebird con Delphi 2007
-
07-07-2019 - |
Domanda
Ho un database Firebird (in esecuzione sul server versione 2.1.3) e mi sto collegando ad esso con Delphi 2007 usando gli oggetti DBExpress (usando il driver Interbase)
Una delle mie tabelle nel database è simile a questa
CREATE TABLE MYTABLE
(
MYDATE Timestamp NOT NULL,
MYINDEX Integer NOT NULL,
...
Snip
...
PRIMARY KEY (MYDATE ,MYINDEX)
);
Posso aggiungere alla tabella OK, e in Flame Robin mostra che il campo timestamp ha un valore di millisecondi.
Ma quando seleziono tutto ( select * da MYTABLE
) sulla tabella non riesco a ottenere il valore in millisecondi, poiché viene sempre restituito come 000.
Ciò causa grossi problemi in quanto fa parte della chiave primaria (purtroppo non ho progettato la tabella e non ho l'autorizzazione per cambiarla).
Ho provato quanto segue per ottenere il valore in millisecondi:
sql1.fieldbyname('MYDATE').AsDateTime;
sql1.fieldbyname('MYDATE').AsSQLTimeStamp;
sql1.fieldbyname('MYDATE').AsStirng;
sql1.fieldbyname('MYDATE').AsFloat;
Ma tutti restituiscono 14/09/2009 14: 25: 06.000 quando formattati.
Come posso recuperare il millisecondo da un timestamp?
UPDATE: Nel caso in cui questo aiuti qualcuno in futuro, ecco i driver che ho provato per DBExpress e i risultati.
- Embarcadero - dbExpress Driver for Firebird (Delphi 2010 Versione di prova) - Millisecondi non supportato nei timestamp.
- Chau Chee Yang's - dbExpress Driver per Firebird (Delphi 2007) - Millisecondi non supportato nei timestamp.
- UpScene - InterXpress per Firebird (Delphi 2007) - I millisecondi sono supportati nei timestamp.
- DevArt - dbExpress Driver for InterBase (Delphi 2007) - I millisecondi sono supportati nei timestamp.
Soluzione
Non so se Firebird supporta effettivamente i millisecondi, ma so per certo che il driver InterBase per Delphi 2007 non lo è. Questo perché InterBase non restituisce millisecondi nella sua API C; sebbene InterBase memorizzi DateTimes con precisione inferiore ai millisecondi, l'API InterBase restituisce i tempi in una struttura C TM che non contiene un campo di millisecondi. Pertanto, il driver dbExpress progettato per InterBase non lo supporterà. Quindi, dovrai cambiare i driver come minimo, presumendo che Firebird lo supporti effettivamente.
Altri suggerimenti
Un mio collega ( Edwin van der Kraan ) appena verificato: funziona con FIBplus !
Ha verificato con FIBPlus versione 6.9.6 e Firebird 2.1.1.
Ha inserito un inserto current_timestamp ed è stato estratto con FormatDateTime ('dd-mm-yyyy hh: nn: ss: zzz', TestpFIBDataSetMYDATE.Value)
Quindi ha recuperato la data e l'ora inclusi i millisecondi.
- Jeroen
Firebird FAQ # 305 spiega come aggirare facilmente questo problema tramite il semplice varchar CAST.
Esistono driver dbx di Firebird (puoi provarli):
http://sites.google.com/site/dbxfirebird/ (gratuito )