Я пытаюсь выполнить простой запрос, чтобы получить все строки, созданные в ноябре:
SELECT COUNT(*)
FROM dbo.profile
WHERE [Created] BETWEEN '2014-11-01 00:00:00.000'
AND '2014-11-30 23:59:59.997';
SMSS возвращает:
Преобразование типа данных varchar в тип данных datetime привело к значению вне допустимого диапазона.
Я не понимаю, почему данные преобразуются из varchar в datetime, когда для параметра «Created» установлено значение datetime:
Нужно ли сообщать серверу, что «Создано» - это время и дата? Если нет, почему я получаю это сообщение varchar?
Изменить: значение в базе данных было YYYY-MM-DD
. Ответ от @SqlZim ниже говорит о том, что мне нужно использовать convert (), чтобы сообщить sql, в каком формате находится дата в БД, - и заменить символ пробела на букву T:
select count(*)
from dbo.profile
where [created] between convert(datetime,'2014-11-01T00:00:00.000')
and convert(datetime,'2014-11-30T23:59:59.997');`
CONVERT(DATE, '20141201')
если бы ваша потребность быть явным перевесила все остальное С другой стороны, если базовый столбец имеет тип даты / времени, это на самом деле не обязательно. Вы говорите,WHERE Active = CONVERT(BIT, 1)
чтобы избежатьWHERE Active = 1
интерпретации какINT
?