Fehler bei Filterung nach Datum

Schreib das Datum mal ohne die Bindestriche!

Code:
SELECT *
FROM
    [2895R].[dbo].[T_Produktion]
 
WHERE
    Convert(DateTime ,Auflegezeit) between '20130720 00:00:00.000' and '20130224 23:59:59.997'

Außerdem hast Du immernoch den Monat 22 in Verwendung, also bitte entsprechend korrigieren!
 
Werbung:
Hallo zusammen,

hierzu würde ich gerne mal etwas generelles schreiben, da den Antworten zur Folge die Sache mit den Vergleichen im SQL-System anscheinend nicht vollends klar ist.
Die Funktionsweise von Vergleichen ist elementar für das Verstehen einer WHERE-Klausel, daher halte ich es für wichtig, das auch klar zu stellen.

Allgemein bekannt ist ja sicherlich, dass ein Vergleich generell nur zwei Antworten kennt: Richtig oder Falsch.
Um das entscheiden zu können, muss das System natürlich Funktionalitäten bereitstellen, mit denen Gleichheit bzw. Unterschied festgestellt werden kann.
Dabei sind die Systeme generell vollkommen dumm, der SQL Server ganz besonders. Dieser kann nämlich nur die Inhalte gleicher Datentypen direkt miteinander vergleichen.

Aufgrund dieser Einschränkung werden bei Vergleichen mit unterschiedlichen Datentypen vom System implizite Konvertierungen vorgenommen.
In welchen Datentyp die einzelnen Werte dann konvertiert werden, hängt von der Abarbeitungs-Reihenfolge des Vergleichs ab.

Auch hier sind wieder Einschränkungen, denn nicht für jeden Datentyp ist eine Konvertierung für jeden anderen Datentyp überhaupt definiert.
So kann z.B. ein varbinary nicht direkt in ein float konvertiert und somit natürlich auch nicht miteinander verglichen werden.

Allerding ist es im SQL Server fast immer möglich, einen Datentyp in einen String (varchar, nvarchar) zu konvertieren.
Die Konvertierung in die andere Richtung, also einen String in einen anderen Datentyp, ist hingegen an die inhaltlichen Vorgaben des Datentyps gebunden, in den konvertiert werden soll.

Dieser Thread liefert dazu ein schönes Beispiel:

Code:
 [...]
WHERE Convert(DateTime ,Auflegezeit) between '2013-07-20 00:00:00.000' and '2013-22-24 23:59:59.997'

Hier wird der Wert in der Spalte "Auflegezeit" explizit in einen datetime-Datentyp konvertiert. Nach Reichenfolge des Vergleichs (auch BETWEEN ist ein Vergleich) werden die folgenden Werte,
die ja als Zeichenfolge angegeben sind, ebenfalls in einen dateime-Wert (implizit vom System) konvertiert. Ein Fehler tritt auf, weil die zweite Zeichenfolge im BETWEEN die inhaltlichen Vorgaben des Datentyps "datetime" nicht erfüllt.

Ob die Konvertierung des Werts der Spalte "Auflegezeit" überhaupt notwendig ist, ist fraglich, da nicht angegeben ist, mit welchem Datentyp diese Spalte angelegt ist.
Die Konvertierung der Zeichenfolgen im BETWEEN kann hingegen mit der CONVERT-Funktion auch explitit vorgenommen werden. Im obigen Beispiel von mir habe ich dabei die Konvertierung einer Zeichenfolge in ein datetime-Format bei der Wertzuweisung in eine Variable vorgenommen. Natürlich kann diese Konvertierung auch direkt in der Abfrage genutzt werden.

Hier ein Beispiel an der obigen Syntax (wobei ich den zweiten String inhaltlich so angepasst habe, dass eine Konvertierung möglich ist):

Code:
 [...]
WHERE CAST(Auflegezeit as datetime) between CONVERT(datetime, '20.07.2013 00:00:00', 104)  and CONVERT(datetime, '20.07.2013 23:59:59', 104)

So - der Lehrer hat gesprochen ;)
Ich hoffe, ich konnte etwas Klarheit schaffen.


Viele Grüße,
Tommi
 
Bei mir funktioniert es auch ohne der Convertierung der Zeichenkette.
Code:
[...]
WHERE GeaendertAm between '01.01.2008' and '31.12.2008'

Aber was ich bemerkt habe, es ist nicht mehr möglich, sobald die Uhrzeit in der Zeichenkette vorkommt ~
Sobald die Uhrzeit vorkommt, muss convertiert werden ~

MFG
 
Bei mir funktioniert es auch ohne der Convertierung der Zeichenkette.
Code:
[...]
WHERE GeaendertAm between '01.01.2008' and '31.12.2008'

Aber was ich bemerkt habe, es ist nicht mehr möglich, sobald die Uhrzeit in der Zeichenkette vorkommt ~
Sobald die Uhrzeit vorkommt, muss convertiert werden ~

MFG
Das kommt vermutlich auf dein Datentypen für GeandertAm an. Ich kann einen DATETIME Datentyp wunderbar auch mit einem String wie '2013-22-12 23:59:59.999' vergleichen nur hängt dann die Konvertierung von Dingen wie Ländereinstellungen ab weil ich der DB keine Vorgaben zur Konvertierung mache.
 
Werbung:
GeaendertAm ist bei mir ein DateTime.
Und ja, ich habe meinen Fehler gefunden, den ich beim letztenmal testen gemacht habe. Mit der Zeit funktioniert es auch.

MFG
 
Zurück
Oben