Исходя из предположения, что ваш тип данных неверен, первый шаг - это исправить.
Обратите внимание, я предполагаю, что ваши данные содержат только даты, а не время (что подразумевает ваш запрос) . Во-первых, вам нужно изменить значение всех ваших строк на конвертируемое значение, мы перейдем к формату ISO yyyyMMdd
:
UPDATE dbo.tFake
SET Projected = CONVERT(varchar(8),CONVERT(date,Projected,101),112);
Теперь, когда все строки являются литеральной строкой в формате yyyyMMdd
, мы можем изменить столбец:
ALTER TABLE dbo.tFake ALTER COLUMN Projected date;
Теперь мы можем запустить ваш запрос еще раз, но теперь ваш тип данных правильный, у вас не возникнет проблемы:
SELECT MONTH(Projected) as [Month], count(*) as [Total]
FROM dbo.tFake
WHERE Projected >= '20190101' AND Project < '20200101' --I prefer the >= and < method. This is especially import with date & time data types
GROUP BY Month(Projected)
ORDER BY [Month];
Обратите внимание, что переданные мной литеральные строки также имеют формат yyyyMMdd
. Если вы должны передать буквальную строку в формате MMddyyyy
, вы можете заключить в CONVERT
код стиля 101
: CONVERT(date,'12/31/2019',101)
. 101
означает дату в американском стиле ( CAST и CONVERT (Transact-SQL) .
Помните, что это решение предполагает , что у вас есть только значения даты, а не значения даты и времени. Если это так (у вас есть значения даты и времени), вы захотите использовать соответствующий тип данных даты и времени и использовать стиль ISO8601 вместо стиля ISO.