Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datentyp DateTime und Millisekunden (https://www.delphipraxis.net/127717-datentyp-datetime-und-millisekunden.html)

BigAl 17. Jan 2009 21:21

Datenbank: MSSQL • Version: 2005 • Zugriff über: "SQL Native Client" und ADO

Datentyp DateTime und Millisekunden
 
Hallo zusammen,

in einer Tabelle speicher ich Zeiten und benötige dafür auch die Millisekunden. Bisher habe ich den "Microsoft OLE DB Provider for SQL Server" verwendet und die Daten wie folgt eingefügt:

Delphi-Quellcode:

{ INSERT erzeugen (gekürzt) }
QueryAdd.SQL.Clear;
QueryAdd.SQL.Add('INSERT ProdData ' +
                 '(TimeGMT)' +
                 'VALUES'+
                 '(:TimeGMT)');

{ Parameter "Time" als String, damit Millisekunden gespeichert werden können }
QueryAdd.Parameters.ParamByName('TimeGMT').DataType := ftString;

{ Zeitwert zuweisen }
QueryAdd.Parameters.ParamByName('TimeGMT').Value := FormatDateTime('yyyy.mm.dd hh:nn:ss.zzz', DataLogRec.TimeGMT);

{ INSERT ausführen }
QueryAdd.ExecSQL;
Das hat auch immer bestens funktioniert. Aus diversen Gründen habe ich jetzt aber auf den "SQL Native Client" umgestellt. Da geht es so nicht mehr. Wenn ich das ganze wie folgt kürze, werden auch nur immer ganze Sekunden gespeichert:

Delphi-Quellcode:

{ INSERT erzeugen (gekürzt) }
QueryAdd.SQL.Clear;
QueryAdd.SQL.Add('INSERT ProdData ' +
                 '(TimeGMT)' +
                 'VALUES'+
                 '(:TimeGMT)');

{ Zeitwert zuweisen }
QueryAdd.Parameters.ParamByName('TimeGMT').Value := DataLogRec.TimeGMT;

{ INSERT ausführen }
QueryAdd.ExecSQL;
Das Problem ist halt, dass pro Sekunde mehrere Werte erzeugt werden können. Im Extremfall sind es 10 Werte pro Sekunde. Diese werden vor der Zuweisung immer auf Zehntelsekunden gerundet. Da es sich um ein Datenfeld mit einem eindeutigen Index handelt kommt natürlich die "Duplicate Key" Fehlermeldung...

Hat irgendwer eine Idee wie ich dem Datenfeld die Sekundenbruchteile beibringen kann?

Vielen Dank schonmal

Alex

BigAl 18. Jan 2009 09:51

Re: Datentyp DateTime und Millisekunden
 
Hallo zusammen,

Problem gelöst :hello:. Wie so of habe ich an der falschen Stelle gesucht. Beim Umstellen des Treibers wurde auch die Spracheinstellung für die Anmeldung gelöscht. Diese hatte ich explizit mit "English" überschrieben. Die Standardanmeldung auf dem Rechner ist aber Deutsch. Zur Lösung (und damit es zukünftig nicht mehr passiert) habe ich den ersten geposteten Code wie folgt abgeändert:

Delphi-Quellcode:
QueryAdd.Parameters.ParamByName('TimeGMT').Value := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss.zzz', DataLogRec.TimeGMT);
Jetzt ist die Landeseinstellung nicht mehr relevant, da nach ISO konvertiert wird.

Alex

joachimd 19. Jan 2009 08:19

Re: Datentyp DateTime und Millisekunden
 
Zitat:

Zitat von BigAl
Delphi-Quellcode:
QueryAdd.Parameters.ParamByName('TimeGMT').Value := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss.zzz', DataLogRec.TimeGMT);

eigentlich nimmt man Parameter, damit man von den Systemeinstellungen und Formaten unabhängig ist!
Delphi-Quellcode:
QueryAdd.Parameters.ParamByName('TimeGMT').AsDateTime := DataLogRec.TimeGMT;

BigAl 20. Jan 2009 07:28

Re: Datentyp DateTime und Millisekunden
 
Hallo Joachim,

schau Dir mal den ersten Eintrag an. Dann weisst Du warum ich das so mache. Steht ja explizit drin. Bei AsDateTime gehen die Millisekunden verloren...

Alex

joachimd 20. Jan 2009 08:42

Re: Datentyp DateTime und Millisekunden
 
Zitat:

Zitat von BigAl
Hschau Dir mal den ersten Eintrag an. Dann weisst Du warum ich das so mache. Steht ja explizit drin. Bei AsDateTime gehen die Millisekunden verloren...

Hmmm...ich habe da nicht AsDateTime gefunden, sondern nur Value;) Habe das wohl falsch interpretiert.

BigAl 25. Jan 2009 19:46

Re: Datentyp DateTime und Millisekunden
 
Zitat:

Zitat von joachimd
Zitat:

Zitat von BigAl
Hschau Dir mal den ersten Eintrag an. Dann weisst Du warum ich das so mache. Steht ja explizit drin. Bei AsDateTime gehen die Millisekunden verloren...

Hmmm...ich habe da nicht AsDateTime gefunden, sondern nur Value;) Habe das wohl falsch interpretiert.

Schon klar. Verhält sich aber identisch... Sobald das Datenfeld vom Typ DateTime ist wird bei Value intern auch DateTime verwendet, was zum abschneiden der Millisekunden führt. Der Trick bei meiner Variante ist, dass beispielsweise folgender INSERT-Befehl generiert wird:

INSERT ProdData (TimeGMT) VALUES ('2009.01.25 20:46:15.123')

Regards
Alex

Bbommel 25. Mai 2009 17:22

Re: Datentyp DateTime und Millisekunden
 
Bei einem Problem mit dem Speichern von Millisekunden im SQL Server bin ich über diesen, ein paar Tage alten, Thread hier gestolpert. Danke zunächst an BigAl für die Fragen und die Lösungen, so konnte ich das Problem auch bei mir erst einmal lösen (Datum explizit als String ausweisen und dann so speichern).

Wie aber ja von Joachim zurecht angemerkt: Eigentlich sind solche wilden Konvertierungen ja nicht unbedingt der Sinn des Einsatzes von Parametern. Nur werden halt die Millisekunden immer abgeschnitten, wenn man einen echten TDateTime-Wert direkt übergeben will.

Daher mal die Fragen an die Datenbank-Experten hier: Weiß jemand, wo überhaupt das Problem liegt? Bei Delphi, dem ADO-Treiber oder beim SQL Server selbst? Kann man das irgendwie einfacher lösen, indem man vielleicht nur irgendeinen Parameter besser setzt?

Bis denn
Bommel


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz