0

Je dois convertir une valeur en SQL Server DateTime.SQL - Conversion de la chaîne en date et heure

Les données ci-dessous ressemble:

  • 20161021-12: 55: 16,000
  • 20161021-13: 22: 09,974

J'ai essayé

CONVERT(DATE, '20161021-12:55:16.000', 102) 

et jette une erreur. Puis-je obtenir de l'aide en SQL pour convertir ces échantillons en une date-heure valide?

Ces valeurs sont également exprimées en UTC.

Je dois les convertir en EST.

Appréciez votre aide.

+0

__gVirt_NP_NN_NNPS<__ numéro de format incorrect. Regardez la liste [ici] (https://www.techonthenet.com/sql_server/functions/convert.php) – JohnHC

Répondre

6

Si vous êtes sûr que votre format est cohérent, vous pouvez simplement prendre ce tiret (j'ai utilisé datetime à des fins d'illustration);

CONVERT(DATETIME, REPLACE('20161021-12:55:16.000','-',' '), 102) 

Résultat

2016-10-21 12:55:16.000 

Pour la conversion, vous pouvez convertir en datetime, prenez vos heures puis convertir au format de date que vous voulez;

CONVERT(DATETIME, DATEADD(hh,-5,CONVERT(DATETIME,REPLACE('20161021-12:55:16.000','-',' '))), 102) 

Résultat;

2016-10-21 07:55:16.000 

Pour avoir une meilleure idée de ce fait, mis en avant cinq heures et vous obtiendrez la veille;

CONVERT(DATETIME, DATEADD(hh,-5,CONVERT(DATETIME,REPLACE('20161021-04:55:16.000','-',' '))), 102) 

Résultat

2016-10-20 23:55:16.000 

Pour référence, sur mes systèmes de test que vous n'avez pas besoin de se convertir à 102, qui est la valeur par défaut.

DATEADD(hh,-5,CONVERT(DATETIME,REPLACE('20161021-04:55:16.000','-',' '))) 

Pour obtenir la différence de temps dynamiquement, faites quelque chose comme ceci;

DATEADD(hh,DATEDIFF(hh,GETUTCDATE(),GETDATE()),CONVERT(DATETIME,REPLACE('20161021-04:55:16.000','-',' '))) 
+0

En fonction de l'heure d'été, il sera de 4 ou 5 heures. –

+0

@JohnCappelletti bon point, j'ai mis à jour la réponse pour le faire de manière dynamique. –

0

Try this ...

select CONVERT(DATETIME, replace('20161021-12:55:16.000','-',' '), 102) 

Pour EST

select dateadd(HH,-5,CONVERT(DATETIME, replace('20161021-12:55:16.000','-',' '), 102)) 
0
SELECT CONVERT(datetime,SWITCHOFFSET(CONVERT(datetimeoffset, 
           REPLACE('20161021-12:55:16.000','-',' ')), 
         DATENAME(TzOffset, SYSDATETIMEOFFSET()))) 
    AS ColumnInLocalTime 
+0

Cette réponse bénéficierait d'une explication sur ce que vous faites au-delà des autres réponses. – iamdave

4

Pas besoin de l'CONVERT 102.

Select cast(replace('20161021-12:55:16.000','-',' ') as datetime) 

Retours

2016-10-21 12:55:16.000 

Pour convertir des UTC au serveur local. Il faut garder à l'esprit que la différence de temps va changer avec heure d'été (HAE/HNE)

Select DateAdd(MINUTE,DateDiff(MINUTE,GetUTCDate(),GetDate()),cast(replace('20161021-12:55:16.000','-',' ') as datetime)) 

Reuturns

2016-10-21 07:55:16.000