SQL-запрос, чтобы вернуть список серверов из определенного диапазона дат - PullRequest
0 голосов
/ 08 марта 2019

Я пытаюсь сделать запрос с помощью SQL Server Management Studio 2017 , который возвращает счет всех серверов с предполагаемой датой миграции в этом году. Сейчас у меня есть один запрос, но он все еще возвращает некоторые серверы с датами прошлых лет.

SELECT MONTH(Projected) as [Month], count(*) as [Total] FROM dbo.tFake WHERE Projected >='01/01/2019' AND Projected <='12/31/2019 GROUP BY Month(Projected) ORDER BY [Month]

Формат даты mm/dd/yyyy кстати. Как я могу получить этот запрос, чтобы вернуть только серверы, запланированные на 2019 год?

1 Ответ

1 голос
/ 09 марта 2019

Исходя из предположения, что ваш тип данных неверен, первый шаг - это исправить. Обратите внимание, я предполагаю, что ваши данные содержат только даты, а не время (что подразумевает ваш запрос) . Во-первых, вам нужно изменить значение всех ваших строк на конвертируемое значение, мы перейдем к формату 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.

...