2016-06-29 4 views
0

Я получаю даты в формате: Wed Jun 29 2016 15:57:45 GMT 0100 (GMT Daylight Time)Преобразовать формат необычна строка DATETIME в SQL

Что является лучшим способом, либо преобразовать эту строку в datetime как есть, или сократить его достаточно, чтобы быть преобразованы (например Jun 29 2016 15:57:45) без риска потери данных?

+0

Лучший способ хранения строки datetime в формате данных Datetime. Никогда не храните его как строку, это будет настоящая боль при разборе –

+0

Да, я хочу преобразовать его в 'Datetime'. – user5493187

+0

CLR regex-based функция преобразования. –

ответ

2

Использование Substring и Charindex строковые функции обрезки DateTime

Попробуйте

declare @date_str varchar(100) = 'Wed Jun 29 2016 15:57:45 GMT 0100 (GMT Daylight Time)' 

select cast(substring(@date_str,charindex(' ',@date_str),charindex('GMT',@date_str)-charindex(' ',@date_str)) as datetime) 

Результат:2016-06-29 15:57:45.000

1

Я бы сделать что-то вроде этого. Он ищет местоположение строки 'GMT' в charindex. Затем он использует substring для разделения значения (игнорируя первые 4 символа) и преобразует результат в datetime.

Примеры данных

CREATE TABLE #TestData (OriginalValue nvarchar(100)) 
INSERT INTO #TestData (OriginalValue) 
VALUEs ('Wed Jun 29 2016 15:57:45 GMT 0100 (GMT Daylight Time)') 

Запрос

SELECT 
OriginalValue 
,CONVERT(datetime,SUBSTRING(OriginalValue,4,CHARINDEX('GMT',OriginalValue)-5)) NewValue 
FROM #TestData 

Результат

OriginalValue           NewValue 
Wed Jun 29 2016 15:57:45 GMT 0100 (GMT Daylight Time) 2016-06-29 15:57:45.000 
+0

Может пойти на бросок, когда имя дня больше 3 символов –

+0

Кроме того, в среду более трех символов. Кажется, что ОП использует три символьных значения для его имени дня. –

+0

3 символа всегда используются. Но я не выбрал этот безумный формат даты, я просто застрял с ним. – user5493187

0

Попробуйте это:

DECLARE @w VARCHAR(MAX)= 'Wed Jun 29 2016 15:57:45 GMT 0100 (GMT Daylight Time)' 

SELECT CAST(SUBSTRING(@w, 4, (PATINDEX('%GMT%', @w)-4)) AS DATETIME) 
0

Если ваша строка является фиксированной длиной, а части справа и слева, которые вы пытаетесь избавиться, не растут и не сокращаются, вы должны просто сделать это.

DECLARE @DateStr VARCHAR(100) 
SET @DateStr = 'Wed Jun 29 2016 15:57:45 GMT 0100 (GMT Daylight Time)' 

SELECT CAST(LEFT(RIGHT(@DateStr,49),20) AS DATETIME)