2011-08-05 5 views
2

Bonjour à tous j'essaie d'analyser un fichier xml dans SQl Server 2005. J'ai un champ datetime dans le xml qui est une chaîne comme suit: '20110805060028.387'. Je veux convertir ceci en un champ datetime dans le serveur de SQL, mais je me bats avec la syntaxe. Est-il possible d'obtenir jj/mm/aaaa hh: mm: ss.ms (ms = micro secondes) à partir de cette chaîne?Comment convertir une chaîne en date-heure en utilisant T-SQL?

Répondre

6

Ce n'est pas un format pris en charge, donc vous en aurez besoin;

declare @dt varchar(42)= '20110805060028.387' 
--convert to '20110805 06:00:28.387' 
select cast(stuff(stuff(stuff(@dt, 9, 0, ' '), 12, 0, ':'), 15, 0, ':') as datetime) 

>>2011-08-05 06:00:28.387 
+0

hmm, gentil, j'oublie toujours Stuff ... – Tao

+0

Je n'oublie pas les choses, mais je n'aurais pas dû pouvoir accomplir ça. Merveilleuse réponse comme toujours! – TheVillageIdiot

3

Substring est votre ami ici:

DECLARE @Value NVarChar(50) 
SET @Value = '20110805060028.387' 
SELECT Convert(DateTime, 
    SubString(@Value, 1, 4) + '-' + 
    SubString(@Value, 5, 2) + '-' + 
    SubString(@Value, 7, 2) + ' ' + 
    SubString(@Value, 9, 2) + ':' + 
    SubString(@Value, 11, 2) + ':' + 
    SubString(@Value, 13, 10)) 

(en passant, je suis volontairement ne suit pas le format « jj/mm/aaaa » lors de la création d'une chaîne de date analysable, mais plutôt une organisation internationale (non format assez standard ISO) que le serveur SQL lira correctement quels que soient les paramètres DATEFORMAT du serveur)

+0

vous avez oublié microsecondes – sll

+2

@sll: En fait, je ne l'ai pas :) - ils sont inclus dans la dernière sous-chaîne, la période est déjà là, pas besoin de faire quelque chose de spécial. – Tao

1
DECLARE @parsedValue VARCHAR(MAX) 
DECLARE @rawDateValue VARCHAR(MAX) 
SET @rawDateValue = '20110805060028.387' 

SET @parsedValue = SUBSTRING(@rawDateValue, 1, 4) + '/' + 
SUBSTRING(@rawDateValue, 5, 2) + '/' + 
SUBSTRING(@rawDateValue, 7, 2) + ' ' + 
SUBSTRING(@rawDateValue, 9, 2) + ':' + 
SUBSTRING(@rawDateValue, 11, 2) + ':' + 
SUBSTRING(@rawDateValue, 13, 2) + ':' + 
SUBSTRING(@rawDateValue, 16, 3) 

SELECT CONVERT(datetime, @parsedValue) 
1

Mon point (nécessairement le meilleur):

DECLARE @val VARCHAR(30)='20110805060028.387' 
SELECT LEFT(@val,4) [yyyy], RIGHT(LEFT(@val,6),2)[mm], RIGHT(LEFT(@val,8),2)[dd], 
     RIGHT(LEFT(@val,10),2)[hh], RIGHT(LEFT(@val,12),2)[mi], 
     RIGHT(LEFT(@val,14),2)[ss],SUBSTRING(@val, 15,LEN(@val)-14) [ms] 

DECLARE @date DATETIME 
SELECT @date = CAST(LEFT(@val,4) + '-' + RIGHT(LEFT(@val,6),2) + '-' + 
       RIGHT(LEFT(@val,8),2) + ' ' + RIGHT(LEFT(@val,10),2) + ':' + 
       RIGHT(LEFT(@val,12),2) + ':' + RIGHT(LEFT(@val,14),2) + 
       SUBSTRING(@val, 15,LEN(@val)-14) AS DATETIME) 

SELECT @date, DATEPART(MILLISECOND,@date)[ms], DATEPART(MONTH,@date)[MM] 
Questions connexes