AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi MSSQL - DateTime to Int liefert unterschiedliche Werte
Thema durchsuchen
Ansicht
Themen-Optionen

MSSQL - DateTime to Int liefert unterschiedliche Werte

Ein Thema von Aviator · begonnen am 11. Dez 2020 · letzter Beitrag vom 13. Dez 2020
Antwort Antwort
Seite 2 von 2     12   
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#11

AW: MSSQL - DateTime to Int liefert unterschiedliche Werte

  Alt 12. Dez 2020, 11:32
Ein Datum ist bei mir immer .AsDateTime, egal welche Datenbank. Und wenn ich keine Uhrzeit habe? Ja und, dann ist es halt .AsDateTime um 0:00 Uhr.

Damit hatte ich noch nie irgendwelche Probleme. Mir war bis gestern nicht mal bekannt, dass es bei Delphi und MSSQL überhaupt die technische Möglichkeit gibt, einen "Zweitagesfehler" zu provozieren.

Bis jetzt (ca. 20 Jahre) musste ich mich nie um irgendeine Datumskonvertierung zwischen Delphi und einer beliebigen Datenbank kümmern. Die Schnittstellen haben das bisher immer transparent gemanagt. Damit umgehe ich auch eventuell mögliche Probleme, die durch unterschiedliche Ländereinstellungen bei Client / Server / Datenbank ggfls. für Probleme sorgen könnten. Die Datenbankschnittstellen sind eigentlich alle intelligent genug implementiert, um damit umgehen zu können.

.Value ist meiner Meinung nach die schlechtmöglichste Alternative: Das ist ein Variant. Und bei Varianten wird immer interpretiert, "was wohl am ehesten gemeint sein könnte". .Value ist für Typsicherheit eher ungeeignet.

Wenn ich 'nen String habe, nehme ich .AsString,
bei 'nem Integer .AsInteger,
bei 'nem Gleitkommawert .AsFloat,
bei 'nem Boolean .AsBoolean.

Warum nimmt man in Gottesnamen bei 'nem Date, Time, DateTime nicht .AsDateTime, sondern 'nen Integer? Nur weil man ein Datum ohne Uhrzeitanteil zufällig auch als Integer darstellen kann? (Bei Linux sind es übrigens Sekunden seit 1.1.1970, da wäre die Differenz irgendwie anders und wohl meist ein bisserl größer und garantiert nicht immer konstant.)

Bei 'nem String, der zufällig nur Ziffern (ohne Nachkommaanteil) enthält, nimmt doch auch nicht .AsInteger, nur weil das zufällig auch meistens klappt.

Ein String ist ein String.
Ein Integer ist ein Integer.
Ein Datum ist ein Datum.

.Value nehme ich nur, wenn ich nicht weiß was es ist und mir auch egal ist, was es ist. Hauptsache irgendwie rein in die Datenbank und ggfls. auch wieder irgendwie raus. Die, die dieses "Irgendwas" nutzen wollen, müssen sich dann selbst drum kümmern, dass sie damit auch was anfangen können. (Kommt in (meinem) täglichen Leben eher extrem selten bis garnicht vor )

Was auch gut geht: Hab' ich ein Datum nur als Zeichenfolge, dann nehme ich .AsString und konvertiere nicht selber. Die Datenbanksschnittstellen kriegen das gehändelt und jede Datenbank bekommt damit das für sie richtige Datumsformat. Und wenn das nicht klappt (weil die Zeichenfolge einen Wert enthält, der nicht in ein gültiges Datum verwandelt werden kann), dann fliegt 'ne Exception. Darauf kann man dann reagieren. Aber man muss garantiert nicht nach 'ner Zeitdifferenz suchen, die nur dadurch entstehen kann, dass man absolut ungeeignete Werte verwendet, die technisch zufällig von beiden Seiten "irgendwie" verstanden werden können.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#12

AW: MSSQL - DateTime to Int liefert unterschiedliche Werte

  Alt 12. Dez 2020, 11:47
Warum nimmt man in Gottesnamen bei 'nem Date, Time, DateTime nicht .AsDateTime, sondern 'nen Integer? Nur weil man ein Datum ohne Uhrzeitanteil zufällig auch als Integer darstellen kann? (Bei Linux sind es übrigens Sekunden seit 1.1.1970, da wäre die Differenz irgendwie anders und wohl meist ein bisserl größer und garantiert nicht immer konstant.)
Das Thema ist doch schon längst abgehakt. Kein Grund noch irgendwie ausfallend zu werden. Die Übergabe mit .Value war ein Fehler, den ich so nicht mehr machen werde. Die Umwandlung in einen Integer kam durch die Implementierung in Delphi. Und dadurch kam dann auch die Differenz zustande.

Und das es in Linux Sekunden ab 01.01.1970 sind ist mir auch bekannt. Nur war mir eben nicht bekannt, dass der Delphi TDate Datentyp einen anderen Startpunkt hat als der von MSSQL.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#13

AW: MSSQL - DateTime to Int liefert unterschiedliche Werte

  Alt 12. Dez 2020, 12:02
Sorry, es tut mir leid.

Ich wollte Dir nicht zu nahe treten, es war auch nicht ausfallend gemeint.

Du bist hier halt nur über ein Problem gestolpert, dass mich quasi schon seit Jahren verfolgt, da Probleme mit Datumswerten immer wieder auftreten. Du bist damit also nicht alleine.

Mir ging es eigentlich nur darum, auf die bestehende Grundproblemetik bei Datumswerten irgendwie hinzuweisen, absolut losgelöst von Deiner Person.

Nur damit andere, die später auf diesen Thread stoßen, Analogien für ihre eigene Fragestellung finden können.

Offensichtlich ist mir das aber deutlich misslungen.

Tut mir leid, das war nicht meine Absicht.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#14

AW: MSSQL - DateTime to Int liefert unterschiedliche Werte

  Alt 12. Dez 2020, 12:18
Offensichtlich ist mir das aber deutlich misslungen.
Eigentlich war es nur der von mir zitierte Satz der etwas "überheblich/ausfallend" rüberkam. Ich bin dir auch nicht böse deshalb. Für die Nachwelt sind sicherlich noch einige interessante Informationen dabei.


Also alles cool.
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.081 Beiträge
 
Delphi 2009 Professional
 
#15

AW: MSSQL - DateTime to Int liefert unterschiedliche Werte

  Alt 13. Dez 2020, 01:38
In OLE beginnt die Epoche am 0. Januar des Schaltjahres 1900. Ja, es ist ausdrücklich nicht der 31. Dezember 1899 (formatiert mal in Excel 0 oder 60 als Datum). Und ja, 1900 war kein Schaltjahr.
Aus den Gründen hat Delphi den minus-1. Januar des Normaljahres 1900 (auch 30. Dezember 1899 genannt) als Start der Epoche. Bei Tagen ab dem 1.3.1900 kann man bei der Arbeit mit OLE den Unterschied ignorieren. OLE kennt keine Datumsangaben vor Beginn der Epoche.
Die Epoche beginnt bei SQL Server am 1. Januar des Normaljahres 1900. Warum Microsoft da ein anderes Datum als bei ihren anderen Produkten gewählt hat, erschließt sich mir nicht.

Da muss man höllisch bei überladenen Methoden aufpassen, die was an die Datenbank übergeben, da man in Delphi Double und TDateTime nicht unterscheiden kann, sonst hat man die zwei Tage Differenz.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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:23 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