-1
votes

Convertir cette chaîne "2020-10-19T12: 19: 04 + 0530" en date ou date / heure

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.


10 commentaires

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) en datetime2(7) ou - dans votre cas et de vous en tenir à datetime - essayez CAST(CAST(@x AS datetime2(7)) AS DATETIME)@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 non DateTimeOffset ? Notez que DateTimeOffset est le seul type de données dans SQL Server qui prend en charge le décalage de fuseau horaire ...


3 Réponses :


0
votes

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)
)


0 commentaires

0
votes
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/

0 commentaires

0
votes

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)


5 commentaires

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