Datum, SQL Abfrage
-
Hallo Leute,
ich habe ein Problem, dass wohl viele haben dürften und dementsprechend ist viel im Netz zu finden, ABER ncht das was mir weiter geholfen habe, insofern hoffe ich mal dass Ihr mir helfen könnt.
Ich programmiere eine C-Anwendung die mittels ADO auf eine MS SQL 2000 Datenbank zugreift.
Ich muss bei einer Abfrage die Datumsgrenzen einschränken sinngemäß sollte die Abfrage wie folgt aussehen:
"Select * from journal where datum>=datum1 AND datum<=datum2 order by datum"
Wenn ich folgende Abfrage auf den SQL Server loslasse:
"Select * from journal where datum>='01-12-2008' AND datum<='03-12-2008' "
bekomme ich ein Ergebnis. Leider fehlen aber trotzdem einige Belege die in dem Zeitraum erfasst worden sind. Schaue ich mir die Tabellen direkt an, stimmen die Datumsangaben, ergo hätten diese zurückgegeben werden müssen.Ich habe versucht mit Convert zu arbeiten, anbei mal ein Beispiel:
"Select * from journal where datum>=CONVERT(datetime, '01-12-2008', 104) AND datum<=CONVERT(datetime, '03-12-2008', 104) "Anderes herum habe ich es auch getestet ohne Erfolg.
Ein Between bringt mich auch nicht weiter, wer kann mir da weiterhelfen, was mach eich falsch?Gruss
Achim
-
versuch mal folgendes, funktioniert zumindest mit Access.
select * from journal where datum >=#12/01/2008# and datum <=#12/03/2008#;
-
Verwende die '2008-12-31' Variante, mit oder ohne CONVERT.
(Für CONVERT wäre es IIRC Format 121)
-
Danke für Eure Antworten.
@Gast1 Nein das geht nicht, dann wird sofort ein Fehler geworfen, es gäbe einen Fehler in der nähe vonm '#'
@hustbaer Also der Ansatz ist gut, aber da ich das Datumsformat bereits auf dmy umgestellt habe, wird mit den Angaben gar nichts gefunden. Ich habe die Einstellung rückgändig gemacht, war leider auch nicht erfolgreich....
Gruss
Achim
-
normalerweise will die MSSQL Datumswerte im Format 'yyyy-dd-mm'
in welcher Form übergibst du denn die Datumswerte an das Query?
-
Hallo Linnea,
das Format habe ich auch schon gewählt gehabt, aber auch hier wurden mir nicht alle Datensätze zurückgegeben.
Wenn ich das datum um 2 oder 3 Tage über die Grenzen (bsp: 29.11.2008 - 04.12.2008) hinwegverschiebe, bekomme ich die Datensätze vom 01.12.2008 die bei meiner Abfrage >=01.12.2008 gefehlt haben.Gruss
Achim
-
Also erstmal... ist der Datentyp der Spalte die du prüfst auch "datetime" (bzw. "smalldatetime")? Wenn nicht, dann konvertiere die Spalte nach datetime. Entweder permanent in der Tabelle, oder nur für den Vergleich in der Abfrage. (Bei der 2. Möglichkeit kann SQL Server die Abfrage dann allerdings nichtmehr über einen Index auf diese Spalte optimieren -- wenn das Datum die "selektivste" Filterbedingung ist wäre diese Variante also nicht so gut)
Wenn schon, kann ich mir echt nicht vorstellen, was das Problem sein könnte. MS SQL Server erkennt das Format "yyyy-mm-dd" zuverlässig, egal was für ein Datumsformat "eingestellt" ist. "yyyy-mm-dd" kann man schon anhand der position der "-" nicht mit "dd-mm-yyyy" verwechseln, und da es auch kein "yyyy-dd-mm" format gibt, wird "yyyy-mm-dd" *immer* korrekt erkannt. Natürlich nur wenn es eine implizite Konvertierung nach "datetime" gibt, also z.B. wenn man diesen String mit einer "datetime" Spalte vergleicht.
Wenn du so einen String mit einer anderen String (char/varchar/nchar/nvarchar) vergleichst, dann kommt in der "dd-mm-yyyy" Version natürlich blödsinn raus. Das ist auch einer der Vorteile des "yyyy-mm-dd" Formats: man bekommt mit einem String-Vergleich dasselbe Ergebnis wie mit einem Datums-Vergleich.
-
@ARoh
mich würde trotzdem interessieren wie du im Quelltext die Datumswerte an das Query übergibst, eventuell liegt da ja eher das Problem bzw. die Lösung
-
Werden in den Datumsangaben auch Zeitinformationen mitgeführt? Wenn ja musst Du Dich nicht wundern wenn jeweils der letzte Tag fehlt.
-
Hi Zusammen,
danke für die zahlreichen Antworten.
Zunächst einmal habe ich es ausprobiert ob das Problem auch mit Access auftritt.
Folgende Abfrage / Sicht habe ich auf den SQL Server losgelassen:SELECT [Index], Kassennummer, Buchungskonto, Kassierer_ID, Mandant_ID, Zahlung_Scheck_EC, Waehrung, Rechnungsbetrag_Euro, Rechnungsbetrag, Rechnungsdatum, Rechnungsnummer, Kundenname, Kundennummer, Datum_Str, Datum
FROM dbo.Rechnungzahlung WHERE (Datum >= CONVERT(DATETIME, '2008-12-01 00:00:00', 102)) AND (Datum <= CONVERT(DATETIME, '2008-12-03 00:00:00', 102))Und auch diverse andere Abfragen bringen mich nicht weiter. Diese Abfrage habe ich im Übringen "zusammengeklickt" Das Ergebnis ist ähnlich, es werden noch weniger Einträge zurückgegeben. Insofern @Linnea es kann kein Programmiertechnisches Problem sein und @hustbaeres ist die Spalte bereits datetime und nicht smalldatetime. Aber weil es so nett ist, habe ich noch eine Spalte angehängt vom Typ smalldatetime und die Daten aus der Spalte Datum umkopiert, aber auch das brachte keine Besserung. Da es im Grunde nichts mit der Umgebung zu tun hat (C++ sowie Access) liegt der Fehler meines Erachtens am SQL Server. Dem widerspricht, dass ich das Problem auch mit einem anderem Server schon früher hatte. Hmmmm Wo liegt das Problem? Das einzigste ist immer dass der abfragende Rechner gleich ist (und der davor sitzt...) .... Aber mein Rechner arbeitet mit alles anderen SQL-Programmen sauber und ohne Probleme.
Gruss
Achim
-
Hast du mal versucht das Query ohne Umweg über Access oder ähnliches auszuführen? z.B. mittels OSQL?
Das Problem mit dem Datum kenne ich bei MSSQL auch, allerdings lag es dort immer daran, dass ich bei den verwendeten Datenbankkomponenten (ADO im BCB6) versucht habe Werte zu übergeben, bei denen ich bei der Übergabe noch Berechnungen getätigt habe. Das führte dann zum Fehlen von genau 2 Tagen bei den Ergebnissen. Im Management Studio oder per OSQL kamen allerdings immer die kompletten Werte zurück bzw. die Datumskonvertierung funktionierte einwandfrei. Deshalb frage ich nach dem Quellcode bzw. jetzt nach der Programmierumgebung.
-
Wenn die Spalte schon datetime ist sehe ich keine Möglichkeit wie das schief gehen sollte.
Natürlich ist es theoretisch immer möglich dass SQL Server einen Bug hat, aber die Wahrscheinlichkeit eines Bugs dieser Art ist sehr sehr gering.
Versuch mal mit dem Management Studio das Problem nachzustellen, also ein kurzes Script welches eine Tabelle erstellt, ein paar Zeilen einfügt, und dann das Select macht wo Unfug rauskommt.
-
Hallo,
so ich habe die Probleme gefunden:
Ich habe die Abfrage über den Enterprisemanager / Query - Analyser getestet und musst auch da feststellen, dass die Abfrage mangelhaft war.
Erst mit der Angabe der Zeit (2008-12-01 00:00:00:00 und 2008-12-03 23:59:59:00 ) gab es vernünftige Ergebnisse. Das war im Grunde alles... Ich wollte mir die Abfrage mit der Zeit sparen, aber wenn es so sein muss, ist es so.Viele Grüße und Danke für Eure Ideen, die waren hilfreich.
Achim
-
Oha, sorry, ich hatte übersehen dass du <= verwendest, das kann natürlich nicht klappen.
Die Zeit brauchst du trotzdem nicht, mach einfach >= 2008-12-01 AND < 2008-12-04 (also den Tag DANACH!).Ohne Angabe der Zeit wird einfach immer 00:00:00.000 als Zeit angenommen. Da beim Vergleich aber immer die genaue Zeit verglichen wird, fehlt dir bei <= 2008-12-03 der ganze letzte Tag (2008-12-03 00:00:00 besteht den Test, 2008-12-03 00:00:01 schon nichtmehr).
-
Oh Mann, du hast Recht.... Da habe ich geschlafen, irgendwie wird man betriebsblind wenn man ewig einen Fehler sucht.
Danke Dir
-
Gerne
Ich war diesmal auch selber ziemlich blind -- hätte das eigentlich merken müssen...
Egal, jetzt weisst du ja wie's geht.