Échec de la conversion de la date et/ou de l'heure à partir d'une chaîne de caractères lors de l'insertion d'une date.

J'essayais de créer une table comme suit,

create table table1(date1 datetime,date2 datetime);

J'ai d'abord essayé d'insérer des valeurs comme ci-dessous,

insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');

Il a donné une erreur disant,

Canot convert varchar to datetime (Impossible de convertir un paramètre en date)

Ensuite, j'ai essayé le format ci-dessous comme l'un des post suggéré par notre stackoverflow,

insert into table1 values(convert(datetime,'21-02-2012 6:10:00 PM',5)
                          ,convert(datetime,'01-01-2001 12:00:00 AM',5));

Mais j'obtiens toujours l'erreur suivante,

Échec de la conversion de la date et/ou de l'heure à partir d'une chaîne de caractères.

Avez-vous des suggestions ?

Solution

Il existe de nombreux formats pris en charge par SQL Server - voir les [MSDN Books Online sur CAST et CONVERT][1]. La plupart de ces formats dépendent des paramètres que vous avez définis. Par conséquent, ces paramètres peuvent fonctionner dans certains cas, mais pas dans d'autres.

La solution consiste à utiliser le format de date ISO-8601 (légèrement adapté) qui est pris en charge par SQL Server. Ce format fonctionne toujours**, quels que soient la langue et les paramètres du format de date de SQL Server.

Le [format ISO-8601][2] pris en charge par SQL Server existe en deux versions :

  • YYYYMMDD pour les dates uniquement (pas de portion de temps) ; notez ici : sans tirets, c&#8217est très important ! YYYY-MM-DD n'est PAS indépendant des paramètres de format de date de votre serveur SQL et ne fonctionnera PAS dans toutes les situations !

ou :

  • YYYY-MM-DDTHH:MM:SS pour les dates et les heures - notez ici : ce format a des tirets (mais ils peuvent être omis), et un T fixe comme délimiteur entre la partie date et heure de votre DATETIME.

Ceci est valable pour SQL Server 2000 et plus récent.

Donc, dans votre cas concret, utilisez ces chaînes de caractères :

insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');

et tout devrait bien se passer (remarque : vous devez utiliser le format international 24 heures plutôt que le format 12 heures AM/PM).

Alternativement : si vous êtes sur SQL Server 2008 ou plus récent, vous pouvez aussi utiliser le type de données DATETIME2 (au lieu du simple DATETIME) et votre INSERT actuel fonctionnera sans aucun problème ! :-) DATETIME2 est bien meilleur et bien moins pointilleux sur les conversions - et c&#8217est de toute façon le type de données date/heure recommandé pour SQL Server 2008 ou plus récent.

SELECT
   CAST('02-21-2012 6:10:00 PM' AS DATETIME2),     -- works just fine
   CAST('01-01-2012 12:00:00 AM' AS DATETIME2)   -- works just fine  

Ne me demandez pas pourquoi ce sujet est si délicat et quelque peu déroutant - c'est comme ça. Mais avec le format YYYYMMDD, vous devriez vous en sortir pour n'importe quelle version de SQL Server et pour n'importe quelle langue et paramètre de format de date dans votre SQL Server.

[1] : http://msdn.microsoft.com/en-us/library/ms187928.aspx [2] : http://msdn.microsoft.com/en-us/library/ms180878.aspx

Commentaires (3)

La conversion dans le serveur SQL échoue parfois non pas à cause des formats de date ou d'heure utilisés, mais simplement parce que vous essayez de stocker des données erronées qui ne sont pas acceptables pour le système.

Exemple :

Créer la Table MyTable (MyDate);

Insert Into MyTable(MyDate) Values ('2015-02-29&#39 ;);

Le serveur SQL affiche l'erreur suivante :

La conversion a échoué lors de la conversion de la date et/ou de l'heure à partir d'une chaîne de caractères.

La raison de cette erreur est qu'il n'existe pas de date (Feb-29) dans l'année (2015).

Commentaires (2)

Réponse simple - 5 est l'italien "yy&quot ; et 105 est l'italien "yyyy&quot ;. Par conséquent :

SELECT convert(datetime,'21-02-12 6:10:00 PM',5)

fonctionnera correctement, mais

SELECT convert(datetime,'21-02-12 6:10:00 PM',105)

donnera une erreur.

De même,

SELECT convert(datetime,'21-02-2012 6:10:00 PM',5)

donnera une erreur, alors que

SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)

fonctionnera.

Commentaires (0)