Ich habe eine Prozedur mit dieser Struktur erstellt, aber es funktioniert nicht für datetime
Eingangsparameter
Ich habe diese Abfrage ausgeführt, aber
%Vor%aber SQL Server hat mir diesen Fehler
Konvertierung fehlgeschlagen beim Konvertieren von Datum und / oder Uhrzeit aus Zeichenkette.
aber wenn ich mit dieser Abfrage teste, funktioniert es
%Vor%Gespeicherter Prozedurcode:
%Vor%Diese Abfrage ist auch wahr
%Vor%Sie sollten das ISO-8601-Format für Zeichenfolgendarstellungen von Datumsangaben verwenden - alles andere hängt von den SQL Server-Einstellungen für Sprache und Datumsformat ab.
Das ISO-8601-Format für DATETIME
, wenn nur das Datum verwendet wird, ist: YYYYMMDD
(keine Bindestriche oder Antyhing!)
Für DATETIME
mit dem Zeitanteil ist YYYY-MM-DDTHH:MM:SS
(mit Bindestrichen und ein T
in der Mitte, um Datums- und Zeitabschnitte voneinander zu trennen).
Wenn Sie eine Zeichenfolge für SQL Server 2008 oder neuer in ein DATE
konvertieren möchten, können Sie YYYY-MM-DD
(mit den Bindestrichen) verwenden, um dasselbe Ergebnis zu erzielen. Und frag mich nicht, warum das so inkonsequent und verwirrend ist - es ist einfach so, und du musst jetzt damit arbeiten.
Also sollten Sie in Ihrem Fall versuchen:
%Vor% Außerdem - Ihr gespeicherter Proc hat ein Problem, da Sie datetime
und String in eine Zeichenkette verketten, aber Sie konvertieren nicht zuerst datetime
in eine Zeichenkette, und Sie vergessen auch die engen Anführungszeichen in Ihrer Aussage nach beiden Daten.
Also ändere diese Zeile hier zu:
%Vor%Mit diesen Einstellungen und nachdem Sie Ihre gespeicherte Prozedur korrigiert haben, die momentan Probleme enthält, wird es funktionieren.
In diesem Teil Ihres SP:
%Vor%Sie versuchen, Strings und Datumsangaben zu verketten.
Da der Typ datetime
eine höhere Priorität hat als varchar
/ nvarchar
, wird der Operator +
, wenn er zwischen einer Zeichenfolge und einer datetime auftritt, als Addition interpretiert, nicht als Verkettung, und die Engine dann versucht, Ihre Stringteile ( ' or convert (Date,DateLog) >= '''
und andere) in datetime- oder numerische Werte zu konvertieren. Und scheitert.
Das passiert nicht, wenn Sie beim Aufruf der Prozedur die letzten beiden Parameter weglassen, weil die Bedingung false ergibt und die anstößige Anweisung nicht ausgeführt wird.
Um die Situation zu ändern, müssen Sie Ihre Strings um eine Datetime-Variable erweitern:
%Vor%Sie müssen auch schließende einfache Anführungszeichen hinzufügen:
%Vor%Tags und Links datetime sql-server-2008 stored-procedures input-parameters