MS SQL - Abfrage mit Between (Datum)
Sonic
- datenbank
Hallo,
ich habe Datumsfelder in meiner DB, die ein de-Format haben: tt.mm.jjjj hh:mm:ss
Nun habe ich die Funktion "Between" benutzt und bekomme falsche Datensätze geliefert. Liegt das am deutschen Format? Wenn ja, wie kann ich die Daten in der Abfrage ins eng?? ..konvertieren?
Die Daten in der DB sollen unberührt bleiben.
Danke.
Hallo Sonic,
ich habe Datumsfelder in meiner DB, die ein de-Format haben: tt.mm.jjjj hh:mm:ss
also keine Felder vom Datentyp DATETIME oder SMALLDATETIME, sondern von einem Zeichenkettentyp, z.B. CHAR oder VARCHAR?
Nun habe ich die Funktion "Between" benutzt und bekomme falsche Datensätze geliefert. Liegt das am deutschen Format? Wenn ja, wie kann ich die Daten in der Abfrage ins eng?? ..konvertieren?
Du hast neulich die Funktion CONVERT kennengelernt. CONVERT() oder auch CAST() könntest Du verwenden, um in einer Abfrage die vorhandenen Daten in den Datentyp DATETIME umzuwandeln. Mit dem Operator BETWEEN kannst Du nun die berechneten Daten in der Abfrage eingrenzen.
Die Daten in der DB sollen unberührt bleiben.
Das typische Problem: Obwohl die Daten in einem ungeeigneten Format vorliegen, mit dem sich datenbanktechnisch nicht gut arbeiten lässt, müssen sie unberührt bleiben. Du könntest in einer neuen Tabelle mit DATETIME arbeiten und Dir einen View erstellen, der den Namen der bisherigen Tabelle trägt und in dem die Daten (über CONVERT) im alten Format "vorliegen".
Freundliche Grüße
Vinzenz
also keine Felder vom Datentyp DATETIME oder SMALLDATETIME, sondern von einem Zeichenkettentyp, z.B. CHAR oder VARCHAR?
die Datenfelder sind vom Datentyp DATETIME
Du hast neulich die Funktion CONVERT kennengelernt. »»
Ja, genau. Ich habe das Zeitteil extrahiert und es hat auch geklappt. Mit dem Datumteil geht es nicht. Wenn ich sage, gib mir alles zwischen 11.11.2005-12.11.2005, er liefert mir 13.11.2005 auch.
Grüße
Sonic
Hallo,
ich habe hier auch eine DB mit dem Feld Datum in der es im deutschen
Format angezeigt wir und bei mir funktioniert es ohne Probleme ich denke das du vielleicht in der Abfrage einen Fehler hast.
Probier mal das:
SELECT * FROM TABELLE where Datum between '01.12.2005' and '14.12.2005'
Gruß
Schotti
Kannst du mal gucken, ob es so richtig ist?
..WHERE (
(CONVERT(char(8), Von, 108) BETWEEN '00:00:00' AND '23:59:59'
AND CONVERT(char(8), Bis, 108) BETWEEN '00:00:00' AND '23:59:59')
OR
(CONVERT(char(8), Von, 108) BETWEEN '00:00:00' AND '23:59:59'
AND Bis Is Null)
AND
(
(Von BETWEEN '14.12.2005 00:00:00' AND '22.12.2005 23:59:59' AND Bis BETWEEN '14.12.2005' AND '22.12.2005')
OR
(Von BETWEEN '14.12.2005' AND '22.12.2005' AND Bis Is Null)))
Danke!
Hallo Sonic,
Kannst du mal gucken, ob es so richtig ist?
ich fürchte, es ist immer noch Dein Problem, nur bestimmte Stunden in einem bestimmten Datumsbereich auszuwählen, richtig?
(CONVERT(char(8), Von, 108) BETWEEN '00:00:00' AND '23:59:59'
Überlege Dir: Mit CONVERT wandelst Du hier ein Datum um in eine Zeichenkette. Between vergleicht in diesem Fall Zeichenketten miteinander, während Du eher Zeiten miteinander vergleichen möchtest. Ich denke Du wärst hier mit DATEPART besser bedient als mit CONVERT.
(Von BETWEEN '14.12.2005 00:00:00' AND '22.12.2005 23:59:59' AND Bis BETWEEN '14.12.2005' AND '22.12.2005')
hier hingegen sollte BETWEEN so arbeiten, wie Du Dir dies vorstellst.
Freundliche Grüße
Vinzenz
Überlege Dir: Mit CONVERT wandelst Du hier ein Datum um in eine Zeichenkette. Between vergleicht in diesem Fall Zeichenketten miteinander, während Du eher Zeiten miteinander vergleichen möchtest. Ich denke Du wärst hier mit DATEPART besser bedient als mit CONVERT.
Ich habe jetzt ein paar mehr Klammern eingefügt und siehe, es funktioniert. Alle möglichen Eingaben getestet - funktioniert, auch mit CONVERT!
Ich glaube, ich habs hingekriegt. Es fehlten ein paar Klammern :)