Ich versuche, eine einfache Abfrage auszuführen, um alle Zeilen im November zu erstellen:
SELECT COUNT(*)
FROM dbo.profile
WHERE [Created] BETWEEN '2014-11-01 00:00:00.000'
AND '2014-11-30 23:59:59.997';
SMSS gibt zurück:
Die Konvertierung eines Varchar-Datentyps in einen Datetime-Datentyp führte zu einem Wert außerhalb des Bereichs.
Ich verstehe nicht, warum die Daten von varchar in datetime konvertiert werden, wenn 'Created' auf datetime eingestellt ist:
Muss ich dem Server mitteilen, dass "Erstellt" datetime ist? Wenn nicht, warum erhalte ich diese Varchar-Nachricht?
Bearbeiten: Der Wert in der Datenbank war YYYY-MM-DD
. Die Antwort von @SqlZim unten besagt, dass ich convert () verwenden muss, um SQL mitzuteilen, welches Format das Datum in der Datenbank hat - und um das Leerzeichen durch den Buchstaben T zu ersetzen:
select count(*)
from dbo.profile
where [created] between convert(datetime,'2014-11-01T00:00:00.000')
and convert(datetime,'2014-11-30T23:59:59.997');`
CONVERT(DATE, '20141201')
wenn Ihr Bedürfnis, explizit zu sein, alles andere außer Kraft setzt. Wenn es sich bei der zugrunde liegenden Spalte um einen Datums- / Uhrzeittyp handelt, ist dies nicht unbedingt erforderlich. Wollen SieWHERE Active = CONVERT(BIT, 1)
vermeiden,WHERE Active = 1
als interpretiert zu werdenINT
?