Comment convertir cette "2020-10-19T12:19:04+0530"
en Date
ou DateTime
dans SQL Server? J'obtiens cette 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.
3 Réponses :
Vous pouvez essayer de convertir la chaîne d'entrée en type de données datetimeoffset
l'aide de l'un des formats littéraux de chaîne pris en charge pour datetimeoffset (par exemple YYYY-MM-DDThh:mm:ss+hh:mm
). Mais, dans votre cas spécifique, vous devez ajouter :
dans la partie dateimeoffset du texte d'entrée:
DECLARE @datetime varchar(25) = '2020-10-19T12:19:04+0530' SELECT CONVERT( datetime, LEFT(@datetime, 19) )
En remarque, l'utilisation du type de données datetimeoffset
est probablement une meilleure option, car le littéral de chaîne d'entrée contient des informations sur le fuseau horaire. Après cela, vous pouvez convertir cette valeur en d'autres types de données de date et d'heure.
DECLARE @datetime varchar(25) = '2020-10-19T12:19:04+0530' SELECT CONVERT( datetime, CONVERT( datetimeoffset(0), LEFT(@datetime, LEN(@datetime) - 2) + ':' + RIGHT(@datetime, 2) ) )
Bien sûr, vous ne pouvez obtenir que la partie datetime de la chaîne d'entrée et la convertir en type de données datetime
:
DECLARE @datetime varchar(25) = '2020-10-19T12:19:04+0530' SELECT CONVERT( datetimeoffset(0), LEFT(@datetime, LEN(@datetime) - 2) + ':' + RIGHT(@datetime, 2) )
DECLARE @StringDate VARCHAR(40) = '2020-10-19T12:19:04+0530' SELECT CONVERT(DATETIME2,STUFF(@StringDate,23,0,':')) -- RESULT 2020-10-19 12:19:04.0000000 SELECT CONVERT(varchar, CONVERT(DATETIME2,STUFF(@StringDate,23,0,':')), 101) --RESULT 10/19/2020 Try now what you want.Below site helps you to format date. https://www.mssqltips.com/sqlservertip/1145/date-and-time-conversions-using-sql-server/
Voici mon commentaire comme réponse, car il a résolu votre problème:
Si vous n'avez pas la possibilité de modifier l'entrée, vous pouvez essayer d'ajouter la colonne à votre chaîne de date:
SELECT CAST(CAST(LEFT(@x,LEN(@x)-2) + ':' + RIGHT(@x, 2) AS datetimeoffset) AS DATETIME)
Cela fonctionne, oui, fonctionne-t-il comme prévu ... peut-être pas.
@SalmanA selon un commentaire de l'OP sous le message d'origine qui a été supprimé pour une raison inconnue, cela a fonctionné comme prévu par l'OP et son problème a été résolu. Où voyez-vous un problème / bogue dans cette réponse?
il ignore la partie de décalage du fuseau horaire (0530). OP n'a pas mentionné s'il devait être ignoré ou converti; ou peut-être qu'il ne sait pas.
@SalmanA Je ne pense pas qu'il ignore le fuseau horaire: datetime2 est capable de gérer les fuseaux horaires.
@SalmanA oh, OK. J'ai modifié la réponse en conséquence. Mais au moins avec l'exemple donné, le résultat de datetime2 et datetimeoffset est le même
Essayez les documents officiels
La meilleure solution est généralement d'empêcher l'envoi d'une telle chaîne à la base de données en premier lieu. La conversion de / vers des chaînes doit être effectuée aussi loin que possible dans la pile (aussi près de l'utilisateur / du monde extérieur) que possible, puis des types de données plus appropriés peuvent être utilisés partout ailleurs.
Merci @DaleK mais j'ai déjà essayé la solution mentionnée dans la doc officielle mais n'a pas fonctionné.
Merci @Damien_The_Unbeliever qui a du sens. Je vais donc l'analyser avant de l'insérer.
essayez de le
datetime2(7)
endatetime2(7)
ou - dans votre cas et de vous en tenir à datetime - essayezCAST(CAST(@x AS datetime2(7)) AS DATETIME)
où@x
est votre chaîne de date.@ Tyron78 Merci, j'ai essayé ce que vous avez dit mais j'obtiens la même erreur
Astuce:
SELECT CONVERT(datetimeoffset, '2020-10-19T12:19:04+05:30')
, notez le:
dans le datetimeoffset.@PragatDeshpande ah, je vois où est le problème: le décalage horaire a besoin d'une colonne au milieu - la chaîne doit se terminer par
+05:30
au lieu de+0530
.@PragatDeshpande si vous n'avez pas la possibilité de changer l'entrée, vous pouvez essayer d'ajouter la colonne:
SELECT CAST(CAST(LEFT(@x,LEN(@x)-2) + ':' + RIGHT(@x, 2) AS datetime2(7)) AS DATETIME)
Êtes-vous sûr de vouloir
DateTime
et nonDateTimeOffset
? Notez queDateTimeOffset
est le seul type de données dans SQL Server qui prend en charge le décalage de fuseau horaire ...