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

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

De nombreux formats sont pris en charge par SQL Server - consultez la documentation en ligne MSDN sur CAST et CONVERT. La plupart de ces formats sont dépendants sur quels paramètres vous avez - par conséquent, ces paramètres peuvent fonctionner parfois - et parfois non.

La façon de résoudre ce problème est d'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 vos paramètres de langue et de format de date SQL Server.

Le format ISO-8601 est pris en charge par SQL Server et se décline en deux versions :

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

ou :

  • YYYY-MM-DDTHH:MM:SS pour les dates et les heures - notez ici :ce format a 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 spécifique, utilisez ces chaînes :

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

et ça devrait aller (remarque :vous devez utiliser le service international 24 heures plutôt que le format 12 heures AM/PM pour cela).

Alternativement :si vous êtes sur SQL Server 2008 ou plus récent, vous pouvez également utiliser le DATETIME2 type de données (au lieu du simple DATETIME ) et votre INSERT actuel fonctionnerait sans aucun problème! :-) DATETIME2 est beaucoup mieux et beaucoup moins pointilleux sur les conversions - et c'est de toute façon les types de données date/heure recommandés 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 tout ce sujet est si délicat et quelque peu déroutant - c'est comme ça. Mais avec le YYYYMMDD format, vous devriez être bien pour n'importe quelle version de SQL Server et pour n'importe quel paramètre de langue et de format de date dans votre SQL Server.