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 en disant,
Impossible de convertir varchar en datetime
Ensuite, j'ai essayé le format ci-dessous comme l'un des articles suggéré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 j'obtiens toujours l'erreur en disant,
La conversion a échoué lors de la conversion de la date et / ou de l'heure à partir de la chaîne de caractères
Aucune suggestion?
sql
sql-server
Mari
la source
la source
Réponses:
Il existe de nombreux formats pris en charge par SQL Server - consultez la documentation en ligne MSDN sur CAST et CONVERT . La plupart de ces formats dépendent des paramètres dont vous disposez - par conséquent, ces paramètres peuvent parfois fonctionner - et parfois non.
La façon de résoudre ce problème consiste à utiliser le format de date ISO-8601 (légèrement adapté) 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 juste des dates (aucune portion de temps); remarquez 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 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 unT
séparateur fixe entre la partie date et heure de votre fichierDATETIME
.Ceci est valable pour SQL Server 2000 et plus récent.
Donc, dans votre cas concret, utilisez ces chaînes:
et ça devrait aller (note: vous devez utiliser le format international de 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 de plainDATETIME
) et votre courantINSERT
fonctionnera sans aucun problème! :-)DATETIME2
est beaucoup mieux et beaucoup moins pointilleux sur les conversions - et ce sont les types de données date / heure recommandés pour SQL Server 2008 ou plus récent de toute façon.Ne me demandez pas pourquoi tout ce sujet est si délicat et quelque peu déroutant - c'est juste comme ça. Mais avec le
YYYYMMDD
format, vous devriez être bien pour n'importe quelle version de SQL Server et pour tout paramètre de langue et de format de date dans votre SQL Server.la source
La conversion dans le serveur SQL échoue parfois pas à cause des formats de date ou d'heure utilisés, c'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 lancera l'erreur suivante:
Conversion failed when converting date and/or time from character string.
La raison de cette erreur est simplement qu'il n'y a pas de date (29 février) dans l'année (2015).
la source
Réponse simple - 5 est l'italien «yy» et 105 l'italien «yyyy». Par conséquent:
fonctionnera correctement, mais
donnera une erreur.
Également,
donnera une erreur, où comme
marchera.
la source
Mettez simplement à jour le format de la date comme ci-dessous
Cela résout le problème pour moi et cela fonctionne bien
la source
DATEFORMAT
paramètres de session . Vérifiez cela en exécutantSET DATEFORMAT MDY;SELECT CAST('2017-08-07 00:00:00' AS datetime); SET DATEFORMAT DMY;SELECT CAST('2017-08-07 00:00:00' AS datetime);
. Cela fonctionnera de manière fiable si vous ajoutez unT
séparateur (yyyy-MM-ddTHH:mm:ss
).Dans la mesure du possible, il faut éviter les littéraux de date / heure spécifiques à la culture .
Il existe des formats sécurisés pour fournir une date / heure comme littéral:
Tous les exemples pour
2016-09-15 17:30:00
ODBC (mon préféré, car il est traité comme le type réel immédiatement)
{ts'2016-09-15 17:30:00'}
- Timbre horaire{d'2016-09-15'}
--Date seulement{t'17:30:00'}
- Heure seulementISO8601 (le meilleur pour partout )
'2016-09-15T17:30:00'
- soyez conscient duT
milieu!Non séparé (petit risque d'être mal interprété comme un nombre)
'20160915'
--uniquement pour une date pureBon à garder à l'esprit: les dates non valides ont tendance à apparaître avec des erreurs étranges
Une raison de plus pour d'étranges erreurs de conversion: l'ordre d'exécution!
SQL-Server est bien connu pour faire les choses dans un ordre d'exécution auquel on n'aurait pas pu s'attendre. Votre déclaration écrite semble que la conversion est effectuée avant qu'une action liée au type n'ait lieu, mais le moteur décide - pourquoi jamais - d'effectuer la conversion à une étape ultérieure.
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 .
la source
le meilleur moyen est ce code
la source
la source
Le format datetime qui s'exécute réellement sur le serveur SQL est
la source
m
etM
). Lisez le commentaire de Dan Guzman sur la réponse de Pronab Roy. Et lisez les autres réponses ici ...Veuillez essayer ceci.
SQL Server attend des dates au format MM / JJ / AAAA, si l'anglais est défini comme langue par défaut.Voici l'enregistrement de la valeur du sélecteur de date dans la base de données sql2008.Mon type de champ est datetime dans la base de données.dpdob est mon nom de sélecteur de date.
Maintenant, utilisez dob dans votre requête d'insertion.
la source
Vous pouvez essayer ce code
la source
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 du casting pour le contourner:
C'est un exemple purifié. La partie clé de cela est:
...' + CAST(CAST(getdate() AS datetime2) AS nvarchar) + '...
Jeter la date comme
datetime2
, puisnvarchar
pour la concaténer.la source
J'ai essayé ça et ça travaille avec moi:
la source
définir Culture en anglais à partir du fichier web.config
par exemple, si vous définissez la culture sur arabe, le thime sera
22/09/2017 02:16:57 ص
et vous obtenez l'erreur: La conversion a échoué lors de la conversion de la date et / ou de l'heure à partir de la chaîne de caractères lors de l'insertion de datetime
la source
Voici comment convertir facilement une chaîne ISO en SQL-Server
datetime
:Source https://www.sqlservercurry.com/2010/04/convert-character-string-iso-date-to.html
la source
Pour moi, cela a fonctionné:
la source