2012-02-28 1 views
0

Всех моих столбцов varchar поэтому я использовал общую таблицу выражений для преобразования [Column 0] в datetime поскольку [Column 0] содержит дату в этом формате 2012-02-28 00:00:08.000T- Sql даты время преобразование не удалось

WITH pss AS 
(
select CONVERT(datetime, [Column 0]) as t, [Column 1], [Column 2], [Column 3], [Column 4], [Column 5], [Column 6] 
from PWS where [Column 0] like '%2/28%' 
) 
select *from pss where datepart(HOUR,[t]) >= '11' AND datepart(HOUR,[t]) <= '12' 

Я получаю следующее сообщение

Msg 242, Level 16, State 3, Line 1
Преобразование типа данных varchar в тип данных datetime приводит к значению вне диапазона.

+0

Вы можете проверить с помощью функции 'ISDATE()', значения которой не преобразуются должным образом. –

+0

yes ISDATE() возвращает все строки с 1 значением, все являются действительными datetimes –

+0

@ AI25 - Идет ли ISDATE() только 1, если вы удаляете предложение where? –

ответ

2

Вы также должны указать подсказку CONVERT относительно структуры даты в varchar. YMD последовательность будет признана 102:

convert(datetime, '2012-02-28 00:00:08.000', 102) 

См http://msdn.microsoft.com/en-us/library/ms187928.aspx для описания CONVERT и доступных стилей даты и времени

+0

Я сделал последовательность 102, но получаю ту же ошибку –

+0

Я успешно справился с 102 (что на самом деле является только частью даты). Если вы хотите полное datetime, тогда 121 соответствует разделителям, которые вы говорите, что используете – kaj

+2

Однако ваш SQL ищет косые черты, которые будут отображаться только для даты. Итак, в каком формате хранятся ваши даты? – kaj

0

Значения для типов данных типа datetime ранее, чем 01 января 1753 года, не разрешены в SQL Server. SQL Server принимает даты, начиная с 1753 года до 9999 года. Если столбец 0 в вашей таблице содержит даты раньше, чем 01 января 1753, у вас может быть такая проблема.

+0

нет, он содержит только данные за 7 дней –

0

Если все остальное терпит неудачу, я хотел бы использовать курсор * Переберите каждую строку, а затем , для каждой строки попытайтесь преобразовать значение [Столбец 0] в DateTime. Окружайте попытку CONVERT блоком TRY..CATCH, затем в блоке CATCH выведите некоторую диагностику, чтобы вы могли точно определить, какая строка вызвала ошибку.

ПРИМЕЧАНИЕ *: да, курсоров, как правило, следует избегать, но в этой диагностической ситуации я думаю, что это полезно.

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