Невозможно преобразовать char в datetime в таблице счетчиков Windows - PullRequest
0 голосов
/ 04 мая 2018

У меня есть таблица в SQL Server 2012, которая заполняется данными perfmon Windows с использованием встроенных процессов Windows. Таблица автоматически создается этим процессом. Проблема в том, что поле метки времени char, но мне нужно datetime.
Я использую представление сгенерированных таблиц, чтобы получить данные в удобной форме, и я хочу преобразовать отметку времени в дату и время в представлении. По какой-то причине все, что я пробую, дает мне эту ошибку:

Ошибка преобразования при преобразовании даты и / или времени из символьной строки.

Я могу скопировать и вставить значение временной метки из таблицы в запрос на конвертацию, и это работает так:

SELECT convert(datetime, '2018-04-04 00:00:08.022', 121);

или

 SELECT cast('2018-04-04 00:00:08.022' as datetime)

Но когда я пытаюсь преобразовать значение непосредственно из таблицы, я получаю ошибку:

SELECT convert(datetime, counterDateTime, 121) from counterData

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

Чего мне не хватает?

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

Пример:

select counterDateTime from counterData where recordindex = '82331' and counterID = '1'
= 2018-04-04 00:00:08.022

select cast('2018-04-04 00:00:08.022' as datetime)
= 2018-04-04 00:00:08.023

select convert(datetime, '2018-04-04 00:00:08.022', 121)
= 2018-04-04 00:00:08.023

select cast(counterDateTime as datetime) from CounterData where recordIndex = '82331'  and counterID = '1'
= Msg 241, Level 16, State 1, Line 109
Conversion failed when converting date and/or time from character string.

Вот пример учебного пособия по получению данных счетчика Windows в базу данных. Это довольно стандартный процесс, есть много других примеров в Интернете. Интересными являются таблицы CounterData и CounterDetails, которые я объединяю с представлением. Именно при создании этого представления я хотел бы сделать преобразование. https://logicalread.com/writing-performance-data-sql-server-mo01/#.WuxgzYgvyzU

Интересующий меня столбец CounterDateTime - это обнуляемый символ длиной 24.

1 Ответ

0 голосов
/ 04 мая 2018

Я протестировал, следуя вашим инструкциям, и смог воспроизвести

SELECT ASCII(RIGHT(CounterDateTime, 1))
FROM dbo.CounterData

Возвращает 0, поэтому я считаю, что ваши данные не могут быть преобразованы. Так в основном последний символ является нулем ASCII.

Обходной путь

SELECT CAST(LEFT(CounterDateTime, 23) AS DATETIME)
FROM dbo.CounterData
...