2011-08-05 2 views
2

こんにちはすべて私はSQl Server 2005でXMLファイルを解析しようとしています。次のように文字列であるxmlのdatetimeフィールドを持っています: '20110805060028.387'。これをSQL Serverのdatetimeフィールドに変換したいのですが、構文に苦労しています。この文字列からdd/mm/yyy hh:mm:ss.ms(ms =マイクロ秒)を得ることは可能ですか?T-SQLを使用して文字列をdatetimeに変換するには?

答えて

6

サポートされている形式ではありません。

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

うーん、いい、私はいつもスタッフを忘れる... – Tao

+0

私はものを忘れることはありませんが、これを達成することはできませんでした。いつものように素敵な答え! – TheVillageIdiot

3

サブストリングは、ここにあなたの友人である:ここで解析可能な日付文字列を作成するときに

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

(ちなみに、私は意図的にあなたの「DD/MM/YYY」フォーマットに従わないのですが、むしろ国際(ではありません非常にISO標準の)形式で、サーバーのDATEFORMATの設定に関係なくSQLサーバーが正しく読み取ります)

+0

あなたはマイクロ秒 – sll

+2

@sll忘れ:実は私は:)なかった - 彼らは最後の部分文字列に含まれています、その時代はすでにそこにあり、特別なことをする必要はありません。 – 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

私のテイク(必ずしもベストではない):

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] 
関連する問題