AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Datentyp DateTime und Millisekunden
Thema durchsuchen
Ansicht
Themen-Optionen

Datentyp DateTime und Millisekunden

Ein Thema von BigAl · begonnen am 17. Jan 2009 · letzter Beitrag vom 25. Mai 2009
Antwort Antwort
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
495 Beiträge
 
Delphi 12 Athens
 
#1

Datentyp DateTime und Millisekunden

  Alt 17. Jan 2009, 21:21
Datenbank: MSSQL • Version: 2005 • Zugriff über: "SQL Native Client" und ADO
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
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
495 Beiträge
 
Delphi 12 Athens
 
#2

Re: Datentyp DateTime und Millisekunden

  Alt 18. Jan 2009, 09:51
Hallo zusammen,

Problem gelöst . 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:

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
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
672 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Datentyp DateTime und Millisekunden

  Alt 19. Jan 2009, 08:19
Zitat von BigAl:
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!
QueryAdd.Parameters.ParamByName('TimeGMT').AsDateTime := DataLogRec.TimeGMT;
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
495 Beiträge
 
Delphi 12 Athens
 
#4

Re: Datentyp DateTime und Millisekunden

  Alt 20. Jan 2009, 07:28
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
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
672 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Datentyp DateTime und Millisekunden

  Alt 20. Jan 2009, 08:42
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.
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
495 Beiträge
 
Delphi 12 Athens
 
#6

Re: Datentyp DateTime und Millisekunden

  Alt 25. Jan 2009, 19:46
Zitat von joachimd:
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
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
652 Beiträge
 
Delphi 12 Athens
 
#7

Re: Datentyp DateTime und Millisekunden

  Alt 25. Mai 2009, 17:22
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:32 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