Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi YEAR échouerait-il avec une erreur de conversion à partir d'une date ?

Je suppose que RValues est une colonne de chaîne d'un certain type, pour une raison quelconque. Vous devez corriger cela et stocker les données de date en utilisant un type de données de date (évidemment dans une colonne distincte de ce sac mixte).

Si vous ne pouvez pas résoudre ce problème, vous pouvez empêcher ce que Damien a décrit ci-dessus en :

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

(Ce qui rendra la "date" NULL si SQL Server ne parvient pas à comprendre comment le convertir en date.)

Vous ne pouvez pas empêcher cela simplement en ajoutant un WHERE clause, car SQL Server essaiera souvent de tenter la conversion dans le SELECT liste avant d'effectuer le filtrage (tout dépend du plan). Vous ne pouvez pas non plus forcer l'ordre des opérations en utilisant une sous-requête, un CTE, des indications d'ordre de jointure, etc. Il existe un élément Connect ouvert à propos de ce problème - ils en sont "conscients" et "espèrent y remédier dans une future version ."

Court d'une expression CASE, qui oblige SQL Server à évaluer le résultat ISDATE() avant de tenter de convertir (tant qu'aucun agrégat n'est présent dans l'une des branches ), vous pourriez :

  • vider les résultats filtrés dans une table #temp, puis sélectionner ensuite dans cette table #temp, et n'appliquer ensuite que la conversion.
  • renvoyez simplement la chaîne et traitez-la comme une date sur le client, et extrayez-en les parties YEAR/MONTH etc.
  • il suffit d'utiliser la manipulation de chaîne pour tirer YEAR =LEFT(col,4) etc.
  • utilisez TRY_CONVERT() puisque je viens de remarquer que vous êtes sur SQL Server 2012 :

    TRY_CONVERT(DATE, RValues) AS FechaFirma