La Conversion a échoué lors de la conversion de la date et/ou du temps à partir de la chaîne de caractères lors de l'insertion de datetime

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é l'erreur disant,

ne peut pas convertir varchar en datetime

puis j'ai essayé le format ci-dessous comme l'un des post suggéré par notre flux 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 suis toujours l'erreur disant,

la Conversion a échoué lors de la conversion de la date et/ou de l'Heure de la chaîne de caractères

des suggestions?

104
demandé sur marc_s 2013-01-02 12:49:59

12 réponses

il existe de nombreux formats supportés par SQL Server - voir le MSDN Books Online on CAST and CONVERT . La plupart de ces formats sont dépendant des paramètres que vous avez - par conséquent, ces paramètres peuvent fonctionner parfois - et parfois pas.

la façon de résoudre ce problème est d'utiliser le (légèrement adapté) format de date ISO-8601 qui est supporté par SQL Server - ce format fonctionne toujours - indépendamment de la langue de votre serveur SQL et des paramètres de dataformat.

le format ISO-8601 est pris en charge par SQL Server vient en deux saveurs:

  • YYYYMMDD pour dates (pas de temps); à noter ici: pas de tirets! , c'est très important! YYYY-MM-DD est PAS indépendant de la dateformat les paramètres de votre Serveur SQL server et pas travailler dans toutes les situations!

ou:

  • YYYY-MM-DDTHH:MM:SS pour les dates et les heures - note: ce format a tirets (mais ils peut être omis), et fixe T comme séparateur entre la date et l'heure de passage de votre DATETIME .

ceci est valable pour SQL Server 2000 et les versions plus récentes.

ainsi dans votre cas concret - utilisez ces cordes:

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

et vous devriez être bien (REMARQUE: Vous devez utiliser le format international 24 heures plutôt que le format AM/PM de 12 heures pour cela).

alternativement : si vous êtes sur le serveur SQL 2008 ou plus récent, vous pouvez également utiliser le type de données DATETIME2 (au lieu du simple DATETIME ) et votre INSERT fonctionnerait sans aucun problème! :- ) DATETIME2 est beaucoup mieux et beaucoup moins difficile sur les conversions-et c'est les types de données date/heure recommandés pour SQL Server 2008 ou plus récent de toute façon.

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 confus - c'est comme ça. Mais avec le format YYYYMMDD , vous devriez être bien pour n'importe quelle version de SQL Server et pour n'importe quelle langue et le réglage de dateformat dans votre SQL Server.

115
répondu marc_s 2015-11-02 18:32:50

la conversion dans SQL server échoue parfois pas en raison de la Date ou de l'heure formats utilisés, il est simplement parce que vous essayez de stocker des données erronées qui ne sont pas acceptables pour le système.

exemple:

Create Table MyTable (MyDate);

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

le serveur SQL va lancer l'erreur suivante:

Conversion failed when converting date and/or time from character string.

la raison de cette erreur est simplement il n'y a pas de telle date (fév-29) dans L'année (2015).

15
répondu Ashraf Abusada 2015-06-06 20:18:34

réponse Simple-5 est Italien "yy" et 105 est Italien"yyyy". 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 l'erreur, où comme

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

fonctionnera.

13
répondu Raj 2017-06-07 05:34:32

dans la mesure du possible il faut éviter les littérales date/heure propres à la culture .

il existe certains formats secure pour fournir une date/heure littérale:

tous les exemples de 2016-09-15 17:30:00

ODBC (mon préféré, car il est traité comme la réel "1519130920 de type" immédiatement)

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

ISO8601 (le meilleur pour partout )

  • '2016-09-15T17:30:00' --attention au T au milieu!

Unseperated (risque minuscule pour obtenir interprété comme un nombre)

  • '20160915' --uniquement pour pur date

bon à garder à l'esprit: les dates invalides 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 étranges erreurs de conversion: L'ordre d'exécution!

SQL-Server est bien connu pour faire des choses dans un ordre d'exécution on pourrait attendions pas. Votre déclaration écrite ressemble à la conversion est fait avant une action liée au type a lieu, mais le moteur décide - pourquoi jamais - de faire la conversion dans une étape ultérieure.

Voici un excellent article expliquant cela avec des exemples: Rusano.com: "t-sql-fonctions-ne-pas-implique-un-certain-ordre d'exécution" et voici la question relative à la .

6
répondu Shnugo 2017-11-25 10:22:59

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

yyyy-MM-dd hh:MM:ss

Il résout le problème pour moi et il fonctionne très bien

4
répondu Pronab Roy 2017-08-19 09:57:43

le meilleur moyen est ce code

"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"
3
répondu Ahmed Soliman Flasha 2016-01-29 18:12:38
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
répondu ARLE ANDINO 2016-01-11 19:45:00

essayez ceci.

SQL Server attend des dates dans le format MM/JJ/YYYY,si l'anglais est défini comme votre langue par défaut.Ici je sauve la valeur du curseur de données à la base de données sql2008.Mon type de champ est datetime dans la base de données.dpdob est mon nom de code.

           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

utilisez maintenant dob dans votre requête insert.

2
répondu SwR 2016-06-02 04:49:46

le format datetime réellement qui s'exécute sur le serveur sql est

yyyy-mm-dd hh:MM:ss
0
répondu Bhavya Dhiman 2016-03-18 11:49:04

vous pouvez essayer ce code

select (Convert(Date, '2018-04-01'))
0
répondu Biddut 2018-04-10 08:45:02

j'ai eu ce problème en essayant de concaténer getdate() dans une chaîne que j'insérais dans un champ nvarchar.

j'ai fait de la coulée pour obtenir autour d'elle:

 INSERT INTO [SYSTEM_TABLE] ([SYSTEM_PROP_TAG],[SYSTEM_PROP_VAL]) VALUES 
   (
    'EMAIL_HEADER',
    '<h2>111 Any St.<br />Anywhere, ST 11111</h2><br />' + 
        CAST(CAST(getdate() AS datetime2) AS nvarchar) + 
    '<br /><br /><br />'
   )

c'est un exemple épuré. La partie clé de cela est:

...' + CAST(CAST(getdate() AS datetime2) AS nvarchar) + '...

plaçait la date comme datetime2 , puis comme nvarchar pour la concaténer.

0
répondu vapcguy 2018-08-16 15:11:42

définir la Culture à l'anglais à partir du web.fichier de configuration

  <globalization uiCulture="en-US" culture="en-US" />

par exemple si vous mettez la culture à l'arabe le thime sera

22/09/2017 02:16: 57"

et vous obtenez l'erreur: la Conversion a échoué lors de la conversion date et/ou heure à partir de la chaîne de caractères tout en insérant datetime

-1
répondu Yusuf 2017-09-22 11:18:50