web-dev-qa-db-fra.com

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

J'essayais de créer un tableau comme suit,

create table table1(date1 datetime,date2 datetime);

J'ai d'abord essayé d'insérer les valeurs 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 en disant:

Impossible de convertir varchar en date/heure

Ensuite, j'ai essayé le format ci-dessous comme l'un des messages proposés 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 je reçois toujours l'erreur en disant:

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

Aucune suggestion?

114
Mari

SQL Server prend en charge de nombreux formats - voir la la documentation en ligne MSDN sur CAST et CONVERT . La plupart de ces formats dépendent de de vos paramètres. Par conséquent, ces paramètres peuvent fonctionner parfois - et parfois pas.

Pour résoudre ce problème, utilisez le format de date _ (légèrement adapté) ISO-8601 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. Il existe deux types d’affichage:

  • YYYYMMDD pour des dates seulement (pas de temps); notez ici: pas de tirets!, c'est très important! YYYY-MM-DD est PAS indépendant des paramètres de dateformat de votre serveur SQL Server et NOT ne fonctionnera pas dans toutes les situations!

ou:

  • YYYY-MM-DDTHH:MM:SS pour les dates et heures - notez ici: ce format a tirets (mais ils peut être omis), et un T fixé en tant que 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:

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

et ça devrait aller (note: 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 une version plus récente, vous pouvez également utiliser le type de données DATETIME2 (au lieu de plain DATETIME) et votre INSERT courante fonctionnerait sans aucun problème! :-) DATETIME2 est bien meilleur et moins pointilleux en matière de conversions - et il s’agit du type de données date/heure recommandé pour SQL Server 2008 ou une version plus récente.

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 format YYYYMMDD, vous devriez pouvoir utiliser n'importe quelle version de SQL Server et tout paramètre de langue et de format de date de votre SQL Server.

123
marc_s

Réponse simple - 5 est l'italien "yy" et 105 est l'italien "yyyy". Donc:

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)

va donner une erreur.

Également, 

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

va donner une erreur, où

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

marchera.

13
Raj

Chaque fois que possible il faut éviter les littéraux de date/heure spécifiques à une culture

Il existe quelques formats secure pour fournir une date/heure sous forme littérale:

Tous les exemples pour 2016-09-15 17:30:00

ODBC (mon préféré, car il est traité immédiatement comme le type real)

  • {ts'2016-09-15 17:30:00'} - Horodatage
  • {d'2016-09-15'} --Date seulement
  • {t'17:30:00'} - heure seulement

ISO8601 (le meilleur pour partout)

  • '2016-09-15T17:30:00' - soyez conscient de la T au milieu!

Non séparé (minuscule risque d'être mal interprété comme un nombre)

  • '20160915' - uniquement pour date pure

Bon à garder à l'esprit: les dates non valides ont tendance à apparaître avec erreurs étranges

  • Il n'y a pas de 31 juin ou 30 février ...

Une raison de plus pour les erreurs de conversion étranges: Ordre d'exécution!

SQL-Server sait bien faire les choses dans un ordre d'exécution inattendu. Votre déclaration écrite semble indiquer que la conversion est effectuée avant une action liée au type a lieu, mais le moteur décide - pourquoi jamais - de procéder à la conversion ultérieurement.

Voici un excellent article expliquant cela avec des exemples: Rusano.com: "t-sql-functions-do-no-imply-a-certain-order-of-execution" et voici la question connexe .

7
Shnugo

Il suffit de mettre à jour le format de date comme ci-dessous

yyyy-MM-dd hh:MM:ss

Cela résout le problème pour moi et cela fonctionne bien 

5
Pronab Roy

la meilleure façon est ce code

"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"
3

S'il vous plaît essayez ceci.

SQL Server attend les dates au format MM/JJ/AAAA. Si l'anglais est défini comme langue par défaut. Je sauvegarde la valeur datepicker dans la base de données SQL2008.

           Dim test = dpdob.Text.Replace("-", "/")
           Dim parts As String() = test.Split(New Char() {"/"c})
           Dim firstPart As String = parts(0)
           Dim thirdPart As String = parts(2)
           Dim secondPart As String = parts(1)
           Dim test1 = secondPart + "/" + firstPart + "/" + thirdPart
           Dim dob = test1

Maintenant, utilisez dob dans votre requête d'insertion.

2
SwR
convert(datetime2,((SUBSTRING( ISNULL(S2.FechaReal,e.ETA),7,4)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),4,2)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),1,2) + ' 12:00:00.127')))  as fecha,
2
ARLE ANDINO

Le format de date/heure actuellement utilisé par le serveur SQL est

yyyy-mm-dd hh:MM:ss
0
Bhavya Dhiman

Vous pouvez essayer ce code

select (Convert(Date, '2018-04-01'))
0
Biddut