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

Correction de Msg 241 "La conversion a échoué lors de la conversion de la date et/ou de l'heure à partir d'une chaîne de caractères" dans SQL Server

Si vous obtenez l'erreur SQL Server Msg 241 indiquant La conversion a échoué lors de la conversion de la date et/ou de l'heure à partir d'une chaîne de caractères , c'est probablement parce que vous essayez de convertir une chaîne en une valeur de date/heure, mais cette chaîne particulière ne peut pas être convertie en une valeur de date/heure.

Exemple d'erreur

Voici un exemple de code qui génère l'erreur :

SELECT CAST('Tomorrow' AS date); 

Résultat :

Msg 241, Niveau 16, État 1, Ligne 1La conversion a échoué lors de la conversion de la date et/ou de l'heure à partir d'une chaîne de caractères.

Ici, nous avons essayé de convertir la chaîne Tomorrow à la date tapez, mais Tomorrow n'est pas une date valide qui peut être convertie en une date saisir.

SQL Server ne peut pas convertir la chaîne en une date et donc il a renvoyé une erreur.

Solution 1

Le moyen le plus évident de résoudre ce problème consiste à modifier la chaîne pour qu'elle ressemble à une date réelle.

Si vous dépassez une colonne, vérifiez que vous avez la bonne colonne. Idem si vous transmettez une variable - vérifiez qu'il s'agit de la bonne variable.

Par exemple, la conversion suivante réussit :

SELECT CAST('20 Feb 2030' AS date); 

Résultat :

2030-02-20

Selon le format de la date d'entrée, vous feriez peut-être mieux d'utiliser le CONVERT() fonction, afin que vous puissiez spécifier le format de l'expression de date d'entrée.

Exemple :

SELECT 
    CONVERT(date, '03/02/2030', 101) AS 'US with century',
    CONVERT(date, '03/02/30', 1) AS 'US without century',
    CONVERT(date, '03/02/2030', 103) AS 'British with century',
    CONVERT(date, '03/02/30', 3) AS 'US without century'; 

Résultat :

+-------------------+----------------------+--- ---------------------+----------------------+| États-Unis avec siècle | États-Unis sans siècle | Britannique avec siècle | US sans siècle ||-------------------+----------------------+-- ----------------------+---------------------|| 2030-03-02 | 2030-03-02 | 2030-02-03 | 2030-02-03 |+--------------+--------------------------+ ------------------------+----------------------+ 

Solution 2

Une autre façon de gérer l'erreur consiste à utiliser soit TRY_CAST() ou TRY_CONVERT() . Ces fonctions renvoient NULL au lieu de l'erreur.

Exemple :

SELECT TRY_CAST('Tomorrow' AS date); 

Résultat :

NULL

Cela ne résout pas nécessairement le problème sous-jacent, cela le cache simplement. La conversion n'a toujours pas pu avoir lieu.

Dans tous les cas, cela peut toujours être une option viable, selon vos besoins.

Solution 3

Une autre façon de gérer l'erreur consiste à convertir la chaîne en un type de données différent. Évidemment, ce n'est pas bon si vous voulez vous retrouver avec une date type, mais peut-être que l'erreur est survenue parce que vous avez accidentellement spécifié date type au lieu de l'autre type.

Exemple :

SELECT CAST('Wednesday' AS char(3)); 

Résultat :

Mer