![]() |
Datenbank: MSSQL • Version: 2008 • Zugriff über: ADO
1 Sekunde Unterschied zwischen DB DateTime Feld und Anwendung beim Speichern
Moin zusammen,
ich benötige mal die Erfahrungen von euch. Ich habe heute folgendes Phänomen bemerkt beim Speichern einer Datums- und Zeitangabe in den DB Datentyp DateTime.
Delphi-Quellcode:
In der Datebank steht aber
lastUpdate : TDateTime
lastUpdate := now; // z.B. 2013-05-30 22:22:22 DSData.FieldbyName('lastupdate').AsDateTime := lastUpdate;
Code:
Für mich ist die Sekunde wichtig, da ich das lastupdate aus der Anwendung in einer weiteren Abfrage verwende. Durch die 1 Sekunde bekomme ich dann leider keinen Treffer.
2013-05-30 22:22:23
Wie kann das denn sein? Ich merke mir bzw. speichere ja den Wert vorher in lastUpdate und danach wird er nicht mehr geändert. Das Phänomen tritt aber nicht immer auf zu 75%. Es gibt auch Fälle, wo es passt. Hat das schon mal bemerkt und weiß wie man es abschalten kann? Danke im Voraus. Sven |
AW: 1 Sekunde Unterschied zwischen DB DateTime Feld und Anwendung beim Speichern
Das könnte eine Rundungsungenauigkeit sein. Versuch es doch mal mit AsSQLTimeStamp. Alternativ alle TDateTime-Werte auf ganze Sekunden runden.
|
AW: 1 Sekunde Unterschied zwischen DB DateTime Feld und Anwendung beim Speichern
now enthält auch noch Sekundenbruchteile, das sieht momentan nach Deiner Beschreibung so aus, als würde einer abrunden und der andere aufrunden.
Daher wäre die erste Frage: Kann die Datenbank auch Sekundenbruchteile speichern? Wenn nein, müsstes Du wohl hergehen und lastupdate auf volle Sekunden auf- oder abrunden. Das ist jetzt aber kein Wissen sondern nur eine Vermutung. Mit
Delphi-Quellcode:
kannst Du Dir ja mal ausgeben lassen, ob die Vermutung zutreffend sein könnte.
ShowMessage(FormatDatetime('dd.mm.yyyy hh:nn:ss.zzz',lastupdate));
|
AW: 1 Sekunde Unterschied zwischen DB DateTime Feld und Anwendung beim Speichern
Zitat:
|
AW: 1 Sekunde Unterschied zwischen DB DateTime Feld und Anwendung beim Speichern
Zitat:
Dann muss hier wohl lastupdate sinnvollerweise auf ganze Sekunden gerundet werden, bevor es ans Speichern und Weiterverarbeiten geht. |
AW: 1 Sekunde Unterschied zwischen DB DateTime Feld und Anwendung beim Speichern
Kannst Du dir in der DB nicht einfach eine Stored Procedure anlegen, die den Datensatz in der DB aktualisiert / anhängt?
Von der SP kannst du dir den geschriebenen LastUpdate Wert nach dem Speichern als Ausgabeparameter zurückgeben lassen. Abweichungen zwischen DB und "weiterer Verarbeitung" sind dann ausgeschlossen ... Alternativ kannst Du Dir LastUpdate doch auch wieder zurückholen. Aus Performancesicht ist das aber nicht ganz so optimal.
Delphi-Quellcode:
lastUpdate := now; // z.B. 2013-05-30 22:22:22
DSData.FieldbyName('lastupdate').AsDateTime := lastUpdate; DSData.Post; DSData.Refresh; // Daten aktualisieren, im MultiUser Betrieb hier ggf. noch prüfen ob sich die Cursorposition geändert hat lastUpdate := DSData.FieldbyName('lastupdate').value; // natürlich noch auf NULL prüfen .. |
AW: 1 Sekunde Unterschied zwischen DB DateTime Feld und Anwendung beim Speichern
Vielleicht besteht ja auch Interesse an
![]() Aber keine Ahnung wie gut das funktioniert, habe keine praktische Erfahrung mit MSSQL. |
AW: 1 Sekunde Unterschied zwischen DB DateTime Feld und Anwendung beim Speichern
Zitat:
Wir wissen doch, dass wir gerade mit ".Post" Daten geschrieben haben. Da muss uns doch kein Zweiter drüber informieren .. Eventuell kann man den entgültigen "lastUpdate" Wert aber auch schon kontrollieren, nachdem das ADO Feld gefüllt wurde...
Delphi-Quellcode:
Wäre einen Versuch wert. Dann spart er sich das "Read after Write".
DSData.FieldbyName('lastupdate').AsDateTime := lastUpdate;
lastUpdate := DSData.FieldbyName('lastupdate').value; Obwohl natütlich nichts über ein paar Zeilen guten alten SQL Code geht ..:wink: |
AW: 1 Sekunde Unterschied zwischen DB DateTime Feld und Anwendung beim Speichern
Zitat:
Du möchtest doch einen eindeutigen Identifikator, um deine Daten wiederzufinden, oder? Dann verwende einen. Um einen Datensatz zu markieren, verwende wahlweise einen Zähler (identity), eine GUID (uniqueIdentifier) oder einen Timestamp. Du kannst das clientseitig generieren, hast aber dann i.A. das Problem, das bei Mehrfachzugriff auf die Schreibfunktionen diese Identifikatoren u.U. nicht eindeutig ist (Ausnahme: GUID). Mein Tipp: Verwende eine IDENTITY-Spalte. Genausogut geht aber eine GUID oder TimeStamp-Spalte. ADO liefert dir den neu erzeugten Wert, wenn Du die Feldinformation dieser Spalte richtig initialisierst (Eigenschaften 'AutoGenerateValue'). Auch wenn es immer wieder diesbezüglich Fragen gibt. Eine Alternative wäre das Absetzen des Befehls 'INSERT' mit der 'OUTPUT'-Klausel, was ich wiederum sehr charmant finde:
SQL-Code:
also z.B.:
insert
YourTable (Fields) output inserted.PKColumn values (<YourValueList>)
SQL-Code:
Diesen Befehl kannst Du in einer TADOQuery ausführen. Natürlich mit parametrierten Werten
--Create Table MyTable (ID int IDENTITY (1,1), Name VarChar(50))
insert MyTable (Name) output inserted.ID values ('Furtbichler') |
AW: 1 Sekunde Unterschied zwischen DB DateTime Feld und Anwendung beim Speichern
Fraglich ist außerdem, einen clientbasierten Zeitstempel einzutragen. Wie willst Du kontrollieren, wie die Clients ihre Uhrzeit eingestellt haben? Ich meine, da gehört ein Serverdatum hin. Das wiederum am besten per Trigger.
Und auch wenn Du dann an der Stelle sauber bist, solche Datumsabfragen gehören normal nicht in die Verarbeitung- wie bereits angeführt wurde, wenn dann ins Reporting. |
AW: 1 Sekunde Unterschied zwischen DB DateTime Feld und Anwendung beim Speichern
Bist du nicht der, der mit den Datentypen SmallDateTime und Date rumeexperimentiert?
Also ich habe mit SmallDateTime schon schlechte Erfahrungen gemacht, weil die Genauigkeit und der Bereich einfach zu klein ist. |
AW: 1 Sekunde Unterschied zwischen DB DateTime Feld und Anwendung beim Speichern
Moin zusammen,
danke für die zahlreichen Antworten und Ratschläge. Sehr hilfreich. Ich wollte das LastUpate Feld benutzen, um die ID des geraden eingefügten Datensatzes zu ermitteln. Durch meine Recherche im Internet habe die Ansätze von @@IDENTITY, SCOPE_IDENTITY() und IDENT_CURRENT gefunden. Letzteres brachte mich dann zum Ziel und es ist wesentlich einfacher. Danke an alle und einen schönen Abend. Sven |
AW: 1 Sekunde Unterschied zwischen DB DateTime Feld und Anwendung beim Speichern
Wenn es dir nur um die Id geht, wie wäre es mit folgenden:
Ich nutze TADODataset. Den Cursor auf dem Server setzen.
Code:
ds.open();
ds.append(); ->FelderSetzen ds.post(); ->Id-Feld lesen ds.close(); |
AW: 1 Sekunde Unterschied zwischen DB DateTime Feld und Anwendung beim Speichern
Zitat:
In der MSDN gibts einige Artikel darüber. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz