2013-09-10 3 views
0

У меня есть столбец MeasureDateTime (nvarchar(50)) в моей таблице SQL Server.манипулировать строкой для извлечения даты-времени

Мне нужно получить

|measureFilePath | MeasureDateTime  |  MeasureName  | 
    | 12Nc121   |Thu Jun 19 15:00:05 2011| Annulus 4th RMS (Waves) | 
    | 12NB121   |Thu Jul 19 15:38:05 2012| 3.0mm 4th RMS (Waves) | 
    | 12NXc121  |Tue May 15 12:13:02 2012| BC (mm)     | 
    | 12NA121   |Tue May 15 12:13:02 2012| CT (mm)     | 
    | 12Nc111   |Tue May 15 12:13:02 2012| Reference Angle (deg.) | 
    | 12Nc231   |Wed May 15 12:03:02 2013| Temperature (C)   | 

Я хочу, чтобы получить последние 6 месяцев данных, используя MeasureDateTime колонку, например.

Но проблема в MeasureDateTime имеет nvarchar тип.

Кто-нибудь знает, как это сделать? Возможно ли это?

+5

Почему вы храните дату-время как строку? –

+0

Если у вас есть контроль над таблицей и вы можете использовать ALTER TABLE, вы должны изменить этот столбец на дату и время. – rajah9

+0

Я предполагаю, что это происходит из источника импорта, а не в стандартном формате даты, который понимает SQL - следовательно, хранилище varchar –

ответ

2

Попробуйте

CONVERT(datetime,SUBSTRING(MeasureDateTime,4,100),101) 

преобразовать столбец VARCHAR в формате datetime.

SUBSTRING(MeasureDateTime,4,100) удаляет часть дня недели в строке даты, а звонок CONVERT() с форматом 101 будет принимать формат даты в американском формате.

Выбрать, как может выглядеть

SELECT * FROM table WHERE DATEADD(month, 6, CONVERT(datetime,SUBSTRING(MeasureDateTime,4,100),101)) > getdate() 

я до этого игнорировали вставленную информацию о времени. Здесь еще одна попытка преобразования даты:

convert(datetime,substring(stuff(dt,11,0,right(dt,5)),4,21),101) 

Этот подход основан на равных длинах строк. Я не знаю точно, является ли это здесь.

+0

Это не работает, но хорошее мышление ... Я собираюсь поработать над ним, тем более ... Ошибка msg: Ошибка конверсии при преобразовании даты и/или времени из символьной строки. – Angelina

1

Это немного запутанным, но может работать:

WHERE DATEDIFF(Month, CAST(RIGHT(MeasureDateTime, LEN(MeasureDateTime) - 4) as datetime), GETDATE()) <= 6 
0

Попробуйте использовать триггер для этой таблицы при вставке. Попробуйте решение, предоставленное @ cars10, чтобы получить дату и сохранить ее в поле datetime. Всегда держите поля datetime как datetime, а не varchar полей. Позже вы должны получить записи по дате, и это поле datetime окажется полезным.

Смежные вопросы