Fehlermeldung bei SQL-Filtern zum Erstell-/Änderungsdatum

Forum für Fragen rund um MultiBaseCS.
Antworten
AKlinge
Beiträge: 46
Registriert: Di 1. Sep 2020, 12:29

Fehlermeldung bei SQL-Filtern zum Erstell-/Änderungsdatum

Beitrag von AKlinge »

Hallo,
Ich wollte meine Daten nach dem Änderungsdatum filtern und habe den Abfrageausdruck über das SQL-Filter-Modul erstellt. Bei Tageswerten unter 13 funktioniert das, ab 13 aufwärts kommt die angehängte Fehlermeldung, obwohl das reale Änderungsdatum für alle DS der 14.04.2021 ist. Auch bei den anderen Relationen = bzw. <= und auch beim Erstelldatum dasselbe Problem ...
Programmversion 4.4.1.8 Pro, 64 bit
Erstell_Aenderunsgdatum.jpg
Gibt es dafür eine Erklärung?
Viele Grüße
Andreas

Benutzeravatar
Tino Kohbach
Beiträge: 217
Registriert: Do 30. Jan 2020, 13:29
Kontaktdaten:

Re: Fehlermeldung bei SQL-Filtern zum Erstell-/Änderungsdatum

Beitrag von Tino Kohbach »

Hallo Andreas,

in Deinem Fall wird das Datum vom SQL Server falsch interpretiert. Dies liegt oft an geänderten Ländereinstellungen für Datum/ Uhrzeit.

Du kannst folgendes im benutzerdefinierten SQL-Filter probieren:

Code: Alles auswählen

CONVERT(DATE,tblDaten.Date_Changed) > '14.04.2021'
oder präziser:

Code: Alles auswählen

CONVERT(DATE,tblDaten.Date_Changed, 104) > '18.04.2021'
inkl. Uhrzeit:

Code: Alles auswählen

CONVERT(DATETIME,tblDaten.Date_Changed, 104) > '19.04.2021'

Herzliche Grüße
Tino
Bitte gebt bei jedem Thema die verwendete MultiBaseCS Edition sowie die Versionsnummer an!

z.B. MultiBaseCS Professional, 5.1.0.16

AKlinge
Beiträge: 46
Registriert: Di 1. Sep 2020, 12:29

Re: Fehlermeldung bei SQL-Filtern zum Erstell-/Änderungsdatum

Beitrag von AKlinge »

Moin Tino,
ich habe das nochmal probiert, es ändert aber nichts (deine erste Variante ist allerdings auch nicht anders als die von mir bisher verwendete Syntax, wenn ich das richtig sehe):
Zur Info: alle DS des von mir abgefragten Datenbestandes haben als Änderungsdatum den 14.04.2021
- bei Verwendung auch deiner 3 Filter-Varianten kommt per se bei Tageswerten von 13 und größer die ursprünglich oben erwähnte Fehlermeldung
- bei Werten von 12 und kleiner gibt es Ergebnisse, aber die stimmen anscheinend immer dann nicht, wenn sich die Abfragen auf das Jahr 2021 beziehen, z.B. ...
- CONVERT(DATETIME,tblDaten.Date_Changed, 104) > '12.04.2021' liefert zwar keine Fehlermeldung aber fälschlicherweise auch keine Treffer
- CONVERT(DATETIME,tblDaten.Date_Changed, 104) > '12.04.2020' liefert dagegen richtigerweise alle DS als Treffer
- CONVERT(DATETIME,tblDaten.Date_Changed, 104) < '12.04.2021' liefert fälschlicherweise wieder alle DS als Treffer
- CONVERT(DATETIME,tblDaten.Date_Changed, 104) < '12.04.2020' wiederum liefert richtigerweise keine Treffer.
Viele Grüße
Andreas

AKlinge
Beiträge: 46
Registriert: Di 1. Sep 2020, 12:29

Re: Fehlermeldung bei SQL-Filtern zum Erstell-/Änderungsdatum

Beitrag von AKlinge »

ich sehe gerade, die angehängte Fehlermeldung in meiner ersten Nachricht wird anscheinend - jedenfalls bei mir- nicht mehr in dem Chat angezeigt. Ich schicke sie daher nochmal ...
Erstell_Aenderunsgdatum.jpg
Erstell_Aenderunsgdatum.jpg (241.1 KiB) 11044 mal betrachtet

intacta
Beiträge: 20
Registriert: So 5. Apr 2020, 18:48

Re: Fehlermeldung bei SQL-Filtern zum Erstell-/Änderungsdatum

Beitrag von intacta »

Moin Andreas,

ich kann hier zwar erstmal nur raten, aber wenn 1..12 funktionieren und 13..31 nicht, dann vermute ich, dass die Datenbank die Angabe 'aa.bb.cccc' so interpretiert, dass aa als Monat gewertet wird, bb als Tag und cccc als Jahr.

Dies ähnelt den Gepflogenheiten im angelsächsischen Sprachraum, auch wenn dort zur Trennung eher der Schrägstrich üblich ist und bei uns, die wir dd.mm.yyyy gewohnt sind, der Punkt. Leider scheinen die Programmierer des Datenbanksystems hier eine Fehlertoleranz eingebaut zu haben, die bei je nach Sprachraum anders zu interpretierenden Datumsangaben lieber einen Interpretationsfehler zulässt, als beim Anwender eine eindeutig interpretierbare Angabe erzwingt :-(

Ich würde also mal probieren, das Datum 'mm.dd.yyyy' zu schreiben, also:

Code: Alles auswählen

CONVERT(DATE,tblDaten.Date_Changed) > '10.13.2020'
Möglicherweise ist es hilfreich, immer ein nicht weiter interpretierbares Datumsformat zu verwenden, z.B. nach ISO 8601 mit einer vierstelligen Jahreszahl als erstem Element (siehe angegebene Microsoft-Website):

Code: Alles auswählen

JJJJ-MM-TT
Identisch mit dem SQL-Standard. Dieses ist das einzige Format, das als internationaler Standard definiert ist.
LG,
Torsten

Literatur:
https://docs.microsoft.com/de-de/sql/t- ... rver-ver15
(unter "Unterstützte Formate der Zeichenfolgenliterale für date")

AKlinge
Beiträge: 46
Registriert: Di 1. Sep 2020, 12:29

Re: Fehlermeldung bei SQL-Filtern zum Erstell-/Änderungsdatum

Beitrag von AKlinge »

Hallo Torsten,
ganz herzlichen Dank für deine Antwort, das war der finale Tip!! Ich fand die Erklärung schon sehr plausibel, muss ich sagen, wäre selber aber wohl nie drauf gekommen.
Allerdings kann man dieses unerwartete Datumsformat auch nicht über die vorgegebene Eingabemaske (z.B. "Änderunsgdatum") des SQL-Filter-Assistenten eingeben (die akzeptiert nur dd.mm.jjjj). Aber: im SQL-Anzeigebereich kann man in der Syntax einer über den Assistenten mit dem normalen Datumsformat eingegebenen Abfrage die Abfolge von Tag und Monat nachträglich ändern und dann liefert die Abfrage tatsächlich auch korrekte Ergebnisse. Wunderbar, das hilft mir sehr bei meiner Arbeit!
Viele Grüße
Andreas

AKlinge
Beiträge: 46
Registriert: Di 1. Sep 2020, 12:29

Nochmal Fehlermeldung bei SQL-Filtern zum Erstell-/Änderungsdatum

Beitrag von AKlinge »

Hallo Tino,
ich habe ja nun mit Hilfe von Torsten verstanden/herausgefunden, das es tasächlich an der Reihenfolge von Tag und Monat in den SQL-Abfrage-Ausdrücken liegt, ob die Abfragen mit Datumsangaben überhaupt funktionieren. Da wollte ich nochmal nachhaken, weil ich das absolut unbefriedigend finde, dass man nicht ohne weiteres Abfragen zu Datum, Geprüft am, Erstellungsdatum oder Änderungsdatum mit dem SQL-Abfrage-Assistenten erstellen kann.
Über die Eingabemaske des Assistenten kann ich ja nur Datumseingaben der Form tt.mm.jjjj machen, die aber je nach Konstellation zu falschen Ergebnissen oder Fehlermeldungen (siehe unten bzw. oben) führt, weil MBCS das Datum in der Form mm.tt.jjjj interpretiert, wie du sagtest. Wenn ich z.B. das Datum 14.04.2020 eingebe, geht das zwar zunächst, aber es kommt nach Ausführung gleich die Fehlermeldung (da es den Monat 14 ja nicht gibt). Aber ich kann es aber auch nicht in der Form, die korrekte Ergebnisse liefern würde (04.14.2021) dort in der Eingabemaske eingeben, dann streikt diese !
Ich muss also in den SQL-Filter-Anzeigebereich gehen und dort die Schreibweise des Datums entsprechend anpassen, nur dann funktioniert die Abfrage und es kommt auch ein korrektes Ergebnis heraus. Das kann es doch eigentlich nicht sein, zumal es auch nirgends einen Hinweis dazu gibt, dass dieses Problem auftaucht bzw. wie man es ggf. lösen kann.
Wie müssen denn z.B. die Ländereinstellungen gewählt werden, damit es korrekt funktioniert? Mir ist da nichts aufgefallen, was komisch ist.
Viele Grüße
Andreas

Benutzeravatar
Tino Kohbach
Beiträge: 217
Registriert: Do 30. Jan 2020, 13:29
Kontaktdaten:

Re: Fehlermeldung bei SQL-Filtern zum Erstell-/Änderungsdatum

Beitrag von Tino Kohbach »

Hallo,

nachdem mir dieses Thema nun doch keine Ruhe gelassen hat und ich mich noch einmal intensiver damit beschäftigt habe, hier nun der richtige Lösungsansatz. Das angegebene Datum muss selbstverständlich im SQL in ein Datum gewandelt werden. Dann klappt auch die Abfrage.

Für die folgenden SQL-Beispiele habe ich das Beobachtungsdatum verwendet.

Code: Alles auswählen

tblDaten.Datum = CONVERT(DATETIME, '2021-04-26', 102)
Diese SQL-Syntax findet alle Beobachtungen am 26.04.2021 (um 00:00 Uhr). Allerdings werden keine Beobachtungen mit einer angegebenen Uhrzeit gefunden. Dabei ist es egal, ob wir auf einem deutschen oder englischen Betriebssystem sind. Auch die Ländereinstellungen im BS sollten keine Bedeutung haben.

Sollen alle Beobachtungen eines Tages gefunden werden, egal zu welcher Uhrzeit sie gemacht wurden, dann muss das abgefragte Datumsfeld in ein Datum ohne Uhrzeit gewandelt werden. Das machen wir im SQL Server mit CAST.

Code: Alles auswählen

CAST(tblDaten.Datum AS DATE) = CONVERT(DATETIME, '2021-04-26', 102)
Eine alternative Schreibweise wäre folgende:

Code: Alles auswählen

CAST(tblDaten.Datum AS DATE) = DATEFROMPARTS(2021, 4, 26)
Wir ergänzen die MultiBaseCS Online-Hilfe um diese Beispiele. Die Assistenten in MultiBaseCS passen wir entsprechend an.

Herzliche Grüße
Tino
Bitte gebt bei jedem Thema die verwendete MultiBaseCS Edition sowie die Versionsnummer an!

z.B. MultiBaseCS Professional, 5.1.0.16

Antworten