SQL Server 2008: Conversion de Varchar à Datetime

J'ai une colonne datetime ArrivalDateTime qui est stockée en tant que valeur varchar .

Disons que si la valeur est 20161212093256 , je veux que la sortie soit le 2016-12-12 09:32:56 .

Je pourrais get la partie de la date au format datetime comme ci-dessous.

 SELECT CONVERT(DATETIME2(0), LEFT('20161212093256', 8)) 

Cela renvoie la sortie en tant que 2016-12-15 00:00:00 .

J'ai essayé la requête suivante pour get la partie time aussi.

 SELECT CONVERT(DATE, LEFT('20161212093256', 8)) + ' ' + CONVERT(TIME, RIGHT('20161212093256', 6)) 

Mais cela génère une erreur:

Les types de données date et varchar sont incompatibles dans l'opérateur add

Comment puis-je get à la fois la date et l'heure au format datetime ?

Obtenez d'abord le composant date et convertissez-le en DATETIME , puis récupérez le composant time et convertissez-le en DATETIME également. Enfin, ajoutez les deux résultats:

 SELECT CONVERT(DATETIME,LEFT('20161212093256', 8)) + CONVERT(DATETIME, LEFT(RIGHT('20161212093256', 6), 2) + ':' + SUBSTRING(RIGHT('20161212093256', 6), 3, 2) + ':' + RIGHT(RIGHT('20161212093256', 6), 2) ) 

Pour expliquer plus en détail, la première conversion de résultat est le composant de date:

 2016-12-12 00:00:00.000 

La deuxième conversion est le composant time, mais lorsque vous le convertissez en DATETIME il l'ajoute à la date 0 ou '1900-01-01' , le résultat est:

 1900-01-01 09:32:56.000 

Ensuite, vous ajoutez les deux DATETIME s pour get:

 2016-12-12 09:32:56.000 

Pour se débarrasser du composant ms:

 SELECT CONVERT(DATETIME,LEFT('20161212093256', 8)) + CONVERT(DATETIME, LEFT(RIGHT('20161212093256', 6), 2) + ':' + SUBSTRING(RIGHT('20161212093256', 6), 3, 2) + ':00' ) 

Essaye ça,

 DECLARE @V_STR VARCHAR(20) = '20161212093256' SELECT CONVERT(SMALLDATETIME,LEFT(@V_STR,8) +' '+ --date SUBSTRING(@V_STR,9,2)+':'+ --hour SUBSTRING(@V_STR,11,2)+':'+ --minute SUBSTRING(@V_STR,13,2)) AS DATE_TIME --second 

Essaye ça

 select concat(CONVERT(DATE, LEFT('20161212093256', 8)) , ' ' , CONVERT(TIME, subssortingng(RIGHT('20161212093256', 6),1,2)+ ':' + subssortingng(RIGHT('20161212093256', 4),1,2) + ':' +RIGHT('20161212093256', 2))) 

ci-dessus affichera l'heure avec des millisecondes, ci-dessous sans millisecondes

 select concat(CONVERT(DATE, LEFT('20161212093256', 8)) , ' ' , subssortingng(RIGHT('20161212093256', 6),1,2)+ ':' + subssortingng(RIGHT('20161212093256', 4),1,2) + ':' +RIGHT('20161212093256', 2)) 
 SELECT STUFF(STUFF(STUFF(STUFF(STUFF('20161212093256', 5, 0, '-'), 8, 0, '-'), 11, 0, ' '), 14, 0, ':'), 17, 0, ':')