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?
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.
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.
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
{ts'2016-09-15 17:30:00'}
- Horodatage{d'2016-09-15'}
--Date seulement{t'17:30:00'}
- heure seulement'2016-09-15T17:30:00'
- soyez conscient de la T
au milieu!'20160915'
- uniquement pour date pureSQL-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 .
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
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)"
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.
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,
Le format de date/heure actuellement utilisé par le serveur SQL est
yyyy-mm-dd hh:MM:ss
Vous pouvez essayer ce code
select (Convert(Date, '2018-04-01'))