sql преобразовать строку в дату / дату и время - PullRequest
0 голосов
/ 08 ноября 2018

Мой столбец с именем файла выглядит как «D181115.T000000». Я использовал следующий код, чтобы сделать его строкой, похожей на '2018-11-15'.

select '20' + substring(filename, 2,2) + '-' + substring(filename, 4,2) + '-' + substring(filename,6,2)
from table_name

Затем я хочу преобразовать строку в тип даты (потому что мне нужно отсортировать по дате)

select convert(datetime, '20 + substring(filename, 2,2) + '-' + substring(filename, 4,2) + '-' + substring(filename,6,2)')
from table_name

Тогда я получил это сообщение об ошибке:

Типы данных varchar и varchar несовместимы в вычитании оператор.

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Я хочу преобразовать строку в тип даты

Посмотрите на первое и второе предложения, которые вы включили, они отличаются тем, что вы пропустили цитату и добавили дополнительную цитату во второе.

declare @filename varchar(20) = 'D181115.T000000'
select convert(datetime, '20' + substring(@filename, 2,2) + '-' + substring(@filename, 4,2) + '-' + substring(@filename,6,2))

Производит продукцию:

2018-11-15 00:00:00.000
0 голосов
/ 08 ноября 2018

Я приостановил базу данных SQL Server. В этом случае можно использовать только

select cast('20' + substring('D181115.T000000', 2,6) as date) 

или

select try_cast('20' + substring('D181115.T000000', 2,6) as date) 

YYYYMMDD - это один из двух однозначных форматов даты. Другой - полный формат даты и времени ISO8601. YYYY-MM-DD, с другой стороны, зависит от настройки DATEFORMAT

Обновление

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

По крайней мере, рассмотрите добавление индексированного вычисляемого столбца, который создает дату файла

...