Geben Sie datetime für den Eingabeparameter in procedure ein

9

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%     
Salah Sanjabian 08.04.2012, 09:01
quelle

2 Antworten

22

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.

    
marc_s 08.04.2012, 09:21
quelle
1

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%     
Andriy M 08.04.2012 09:28
quelle