2016-10-14 4 views
3

У меня есть столбец createdate char(26) с данными, как 2004-01-30-21.29.12.893374Преобразовать символ для DateTime в SQL из нечетного формата

Я хочу, чтобы преобразовать этот столбец в стандартной DATETIME

Однако, делая

Convert(DATETIME, createdate,120) 

+

The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

Я также пробовал другие отклонения от значения конвертации, но я чувствую, что формат исходного значения даты вызывает проблему.

Я думаю, мне нужно разбить значение createdate char(26), используя несколько операторов типа LEFT, но я хочу убедиться, что я не слишком усложняю это в первую очередь.

Может ли кто-нибудь помочь мне преобразовать мой формат char в datetime в SQL Server 2008?

Заранее спасибо

+0

В каком формате это? –

+0

На поле "Создать"? Похоже, что это YYYY-MM-DD-HH-MM-SS.MMMM –

ответ

3
Declare @String varchar(50) = '2004-01-30-21.29.12.893374' 

Select cast(Left(Stuff(Replace(Stuff(@String,11,1,' '),'.',':'),20,1,'.'),23) as datetime) 

Возвращает

2004-01-30 21:29:12.893 

ИЛИ для Datetime2

Declare @String varchar(50) = '2004-01-30-21.29.12.893374' 

Select cast(Stuff(Replace(Stuff(@String,11,1,' '),'.',':'),20,1,'.') as datetime2) 

Возвращает

2004-01-30 21:29:12.8933740 
0

Fun с substr!

select convert(datetime, 
    substr(createdate, 1, 10) -- use date part as is 
     + ' ' + substr(createdate, 12, 2) -- hours 
     + ':' + substr(createdate, 15, 2) -- minutes 
     + ':' + substr(createdate, 18, 2) -- seconds 
     + '.' + substr(createdate, 21, 3) -- milliseconds (limit to 3 digits) 
    , 120) as createDate_DatetimeType 
from Table1 
+1

Вы не можете иметь это удовольствие в 'SQL SERVER';) –

0

Вы могли бы сделать это таким образом, без объявленной переменной или подстроки:

SELECT STUFF(a.fix_punc,11,1,' ') as final_dt 
FROM 
    (SELECT REPLACE(LEFT(dt_in, 19), '.', ':') + LEFT(RIGHT(dt_in,7),4) 
    as fix_punc 
    FROM yourtable) as a