Einzelnen Beitrag anzeigen

Aviator

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

MSSQL - DateTime to Int liefert unterschiedliche Werte

  Alt 11. Dez 2020, 12: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