Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warum würde YEAR mit einem Konvertierungsfehler von einem Datum fehlschlagen?

Ich gehe davon aus, dass RValues ist aus irgendeinem Grund eine Zeichenfolgenspalte eines bestimmten Typs. Sie sollten das beheben und Datumsdaten mit einem Datumsdatentyp speichern (offensichtlich in einer separaten Spalte als dieser gemischten Tasche).

Wenn Sie das nicht beheben können, können Sie das, was Damien oben beschrieben hat, verhindern, indem Sie:

CASE WHEN ISDATE(RValues) = 1 THEN CONVERT(Date, RValues) END AS FechaFirma 

(Dadurch wird das "Datum" NULL wenn SQL Server es nicht in ein Datum umwandeln kann.)

Sie können dies nicht einfach durch Hinzufügen eines WHERE verhindern -Klausel, da SQL Server häufig versucht, die Konvertierung in SELECT zu versuchen Liste vor dem Durchführen des Filters (alles hängt vom Plan ab). Sie können die Reihenfolge der Vorgänge auch nicht erzwingen, indem Sie eine Unterabfrage, CTE, Hinweise zur Verknüpfungsreihenfolge usw. verwenden. Es gibt ein offenes Connect-Element zu diesem Problem - sie sind sich dessen "bewusst" und "hoffen, es in einer zukünftigen Version anzugehen ."

Kurz vor einem CASE-Ausdruck, der SQL Server dazu zwingt, das Ergebnis von ISDATE() auszuwerten, bevor versucht wird, es zu konvertieren (solange in keinem der Zweige Aggregate vorhanden sind ), könnten Sie:

  • Speichern Sie die gefilterten Ergebnisse in eine #temp-Tabelle und wählen Sie anschließend aus dieser #temp-Tabelle aus und wenden Sie die Konvertierung erst dann an.
  • geben Sie einfach die Zeichenkette zurück und behandeln Sie sie als Datum auf dem Client und ziehen Sie YEAR/MONTH usw. Teile daraus heraus
  • Verwenden Sie einfach die String-Manipulation, um YEAR =LEFT(col,4) usw. zu ziehen.
  • Verwenden Sie TRY_CONVERT() da ich gerade bemerkt habe, dass Sie auf SQL Server 2012 arbeiten:

    TRY_CONVERT(DATE, RValues) AS FechaFirma