2017-11-03 5 views
0

Ich habe andere Antworten durchgesehen. Aus irgendeinem Grund scheinen sie mein Problem nicht zu beheben. Dies ist der SQL-Code:Datum Zeit varchar Umwandlung

SELECT * 
FROM invoices 
WHERE InvoiceDate BETWEEN CONVERT(datetime,'2012-00-00',120) AND CONVERT(datetime,'2013-00-00',120 ) 
ORDER BY InvoiceDate DESC 

Ich halte die folgende Fehlermeldung erhalten: Die Umwandlung eines varchar-Datentypen auf einen Typen Datetime-Daten in einem Out-of-Range-Wert geführt.

+0

erstellt werden, nicht, dass Sie mit ' DateTime' Typ für Ihre Daten? – VTodorov

+2

Welches "Datum" hat einen 0 Monat und 0 Tag? –

+0

Das Problem ist, dass Sie Strings an erster Stelle verwenden. Es gibt mehrere Dutzend Duplikate. Verwenden Sie einfach keine Strings für Datumsangaben, verwenden Sie parametrisierte Abfragen. Wenn Sie Zeichenfolgen in SSMS (nie in Code) verwenden müssen, verwenden Sie ein * eindeutiges * Format - entweder das vollständige ISO8601 oder das nicht getrennte Datumsformat –

Antwort

0

Sie haben folgendes: CONVERT (datetime, '2012-00-00', 120). Sie können kein Datum ohne einen Tag oder einen Monat erstellen.

2
SELECT * 
FROM invoices 
WHERE InvoiceDate >= '2012-01-01' AND InvoiceDate < '2013-01-01' 
ORDER BY InvoiceDate DESC 
+0

Oder vielleicht einfach 'YEAR (InvoiceDate) = 2012' zur Vereinfachung +1. –

+3

Aber das würde die Verwendung eines Index verhindern, wenn es einen auf "InvoiceDate" gibt. – Lamak

0

einen benannten Parameter verwenden:

DECLARE @year INT; 
SET @year = 2012; 
SELECT * 
FROM invoices 
WHERE InvoiceDate >= DateFromParts(@year,1,1) AND InvoiceDate < DateFromParts(@year+1,1,1) 
ORDER BY InvoiceDate DESC; 

Wenn DateFromParts nicht availanbe (pre-2012 MSSQL) kann das Datum wie diese Warum

WHERE InvoiceDate >= DateAdd(Year,@year-1900,0) AND InvoiceDate < DateAdd(Year,@year-1899,0) 
+0

Es ist nur dann ein benannter Parameter, wenn es sich um eine parameterisierte Abfrage handelt. In jedem Fall, Variable oder Parameter, würden Sie nur ein 'BETWEEN @from und @ to 'benötigen, wenn beide Parameter/Variablen' Datum 'sind –