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 1 von 2  1 2      
Aviator

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

MSSQL - DateTime to Int liefert unterschiedliche Werte

  Alt 11. Dez 2020, 13:06
Datenbank: MSSQL • Version: 2016 • Zugriff über: FireDAC
Hallo zusammen,

ich habe hier ein doch recht kurioses Problem mit MSSQL und Delphi.

Ich rufe Datensätze aus der Datenbank ab, die nach einem Datum eingeschränkt werden sollen. In diese speziellen Beispiel wird abgefragt, ob das Belegdatum größer oder gleich dem übergebenen Datum ist. Anfänglich ist mir das gar nicht aufgefallen, doch jetzt stelle ich fest, dass eine Abfrage ob das Datum >= 30.11.2020 ist keine Werte zurückliefert obwohl das eigentliche Belegdatum der 29.11.2020 ist.

Das Statement wird mit Parametern an den Server übergeben. Also als Beispiel mit Query.Parameters('DateParam').Value := StrToDate('30.11.2020'); . Der echte Wert den ich hier übergebe kommt aus einer anderen Datenbank.

Ich habe nun mit dem SQL Profiler die Query abgefangen die an den Server gesendet wird. Wenn ich diese manuell auf dem Server ausführe kommt ebenfalls kein Ergebnis. Setze ich den Integer Wert in den das Datum bei der Übergabe umgewandelt wird um einen Tag zurück (also Integer - 1), dann wird der Datensatz angezeigt.

Baue ich mir jetzt auf dem SQL Server eine Query zusammen die mir aus einem Datum einen Integer und aus einem Integer ein Datum macht, dann unterscheiden sich die Werte von dem, was Delphi an die Datenbank übergibt. Eine Prüfung auf einer Website liefert allerdings das gleiche Ergebnis wie das von Delphi.


Der Wert 43831 liefert in Delphi als Datum 01.01.2020. Die folgende SQL Abfrage liefert auf dem Server allerdings als Datum dem 03.01.2020.
SQL-Code:
DECLARE @d1 int = 43831
SELECT CONVERT(datetime, @d1, 104)
Umgekehrt herum zeigt der SQL Server beim Konvertieren des Datums in einen Integer Wert den gleichen Wert an, in das er auch dieses Datum umwandelt. Also in sich ist der SQL Server korrekt. Nur die Werte passen nicht zu denen von Delphi und der Website.

Diese Abfrage liefert als Ergebnis 43831. Bei Delphi ist dieser Wert aber bereits der 01.01.2020.
SQL-Code:
DECLARE @d1 datetime = '03.01.2020 00:00:00'
SELECT CONVERT(INT, CONVERT(DATETIME, @d1))

Das müsste doch schon irgendjemandem bereits aufgefallen sein. Es sind also immer zwei Tage Differenz zwischen Delphi und MSSQL.

Hat das jemand eine Idee was hier schief gehen könnte.
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: MSSQL - DateTime to Int liefert unterschiedliche Werte

  Alt 11. Dez 2020, 13:39
Siehe Doku:
https://docs.microsoft.com/de-de/sql...l-server-ver15
http://docs.embarcadero.com/products...TDateTime.html

MSSQL beginnt beim 1.1.1900
Delphi beginnt beim 30.12.1899

Das ergibt eine Differenz von exakt 2 Tagen.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#3

AW: MSSQL - DateTime to Int liefert unterschiedliche Werte

  Alt 11. Dez 2020, 13:43
dass eine Abfrage ob das Datum >= 30.11.2020 ist keine Werte zurückliefert obwohl das eigentliche Belegdatum der 29.11.2020 ist.
Das sieht mir aber vollkommen korrekt aus. Der 29.11.2020 ist ja auch nicht größer oder gleich dem 30.11.2020

Ist da vielleicht noch irgendwo ein Tippfehler?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Aviator

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

AW: MSSQL - DateTime to Int liefert unterschiedliche Werte

  Alt 11. Dez 2020, 13:47
dass eine Abfrage ob das Datum >= 30.11.2020 ist keine Werte zurückliefert obwohl das eigentliche Belegdatum der 29.11.2020 ist.
Ist da vielleicht noch irgendwo ein Tippfehler?
Ja sorry. Genau anders herum. Es gibt ein Belegdatum und ein Startdatum ab wann die Prüfung laufen soll. Das Belegdatum muss >= dem Startdatum sein, damit es in die Prüfung mit einfließt.


Siehe Doku:
https://docs.microsoft.com/de-de/sql...l-server-ver15
http://docs.embarcadero.com/products...TDateTime.html

MSSQL beginnt beim 1.1.1900
Delphi beginnt beim 30.12.1899

Das ergibt eine Differenz von exakt 2 Tagen.
Naja da würde ich mal sagen, dass das ein ganz klarer Fall von PEBKAC ist. Danke für die Info. Das war mir jetzt neu. Da muss ich mal prüfen, wo das evtl. überall Probleme bereiten könnte.

Die Frage wäre jetzt allerdings, ob es hierfür eine einfache Lösung gibt, ohne das ich jedes Mal daran denken muss die zwei Tage abzuziehen.
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: MSSQL - DateTime to Int liefert unterschiedliche Werte

  Alt 11. Dez 2020, 13:55
Ja, die Lösung ist ganz einfach:

Datum als Datum speichern und nicht als Integer.

Oder:
Query.Parameters('DateParam').AsDateTime := StrToDate('30.11.2020');
Query.Parameters('DateParam').AsString := '30.11.2020';

Geändert von Delphi.Narium (11. Dez 2020 um 13:58 Uhr)
  Mit Zitat antworten Zitat
Aviator

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

AW: MSSQL - DateTime to Int liefert unterschiedliche Werte

  Alt 11. Dez 2020, 14:15
Hmm ... Wald und Bäume und so. Schaue ich mir direkt mal an ob es dann problemlos funktioniert.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: MSSQL - DateTime to Int liefert unterschiedliche Werte

  Alt 11. Dez 2020, 15:31
Ja, die Lösung ist ganz einfach:

Datum als Datum speichern und nicht als Integer.
Oder notfalls als String im ISO-Format (Haben wir, da vor 20 Jahren bei Einführung jedes DBMS noch wild eigenes Verhalten bei Datumswerten zeigte)
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Aviator

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

AW: MSSQL - DateTime to Int liefert unterschiedliche Werte

  Alt 11. Dez 2020, 18:58
Ok. Der Test hat etwas länger gedauert. Ein simples Benutzen von Parameter().AsDate hat einen Fehler geworfen. [FireDAC][Phys][ODBC][Microsoft][SQL Native Client]Optionales Feature wurde nicht implementiert . Ich habe jetzt einfach mal noch versucht auf den neuen ODBC Treiber umzustellen anstatt den Native Client zu benutzen. Da gab es dann noch ein paar Schwierigkeiten mit dem ConnectionString. Jetzt scheint es aber zu laufen und den Datensatz hat er auch gefunden.

Danke für die Hilfe. Jetzt weiß ich zumindest mal woher der Fehler kam.
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#9

AW: MSSQL - DateTime to Int liefert unterschiedliche Werte

  Alt 11. Dez 2020, 22:47
Kleiner Tip noch am Rande:
Ich sehe hier viele Funktionen, welche von den Ländereinstellungen abhängig sein.
z.B. StrToDate von den OS und die Convert-Funktionen von der Sprache im Server bzw. der Anmeldung.

Versucht hier am besten unabhängig zu werden von den L.Einstellungen.

Eine Lösung wurde bereits genannt, z.B. nicht zu konvertieren und überall die richtigen Datentypen zu verwenden.
  Mit Zitat antworten Zitat
Aviator

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

AW: MSSQL - DateTime to Int liefert unterschiedliche Werte

  Alt 11. Dez 2020, 23:44
Eine Lösung wurde bereits genannt, z.B. nicht zu konvertieren und überall die richtigen Datentypen zu verwenden.
Da werde ich zukünftig auch genauer darauf achten anstatt immer nur .Value zu nehmen. Der StrToDate() Aufruf war nur ein Beispiel um hier etwas zu demonstrieren. In Wirklichkeit wurde, wie ich im ersten Beitrag geschrieben hatte, ein TDate Wert aus einem anderen Objekt an den Parameter übergeben.

Trotzdem danke für den Hinweis.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 13:10 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