SQL 查询以返回特定日期范围内的服务器列表

SQL query to bring back list of servers from specific date range

我正在尝试使用 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 年使用的服务器?

假设您的数据类型有误,第一步是修复它。 请注意,我假设您的数据仅包含日期,而不包含时间(您的查询暗示)。首先,您需要将所有行的值更改为可转换值,我们将使用 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 的文字字符串,您可以使用样式代码 101 包装在 CONVERT 中: CONVERT(date,'12/31/2019',101) . 101 表示美式日期 (CAST and CONVERT (Transact-SQL).

记住,此解决方案假设您只有日期值,而不是日期和时间值。如果您这样做(具有日期和时间值),您需要使用适当的日期和时间数据类型并使用 ISO8601 样式,而不是 ISO 样式。