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?
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 fixeT
comme séparateur entre la date et l'heure de passage de votreDATETIME
.
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.
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).
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.
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 auT
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 .
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
le meilleur moyen est ce code
"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"
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,
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.
le format datetime réellement qui s'exécute sur le serveur sql est
yyyy-mm-dd hh:MM:ss
vous pouvez essayer ce code
select (Convert(Date, '2018-04-01'))
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.
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