用于从特定日期范围恢复服务器列表的SQL查询

问题描述 投票:0回答:1

我正在尝试使用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 btw。如何才能获得此查询以恢复2019年预计的服务器?

sql sql-server date-formatting
1个回答
1
投票

假设您的数据类型错误,第一步就是解决这个问题。注意,我假设您的数据只包含日期,而不是时间(您的查询暗示)。首先,您需要将所有行的值更改为可转换值,我们将使用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格式传递文字字符串,则可以使用样式代码CONVERT101换入CONVERT(date,'12/31/2019',101)101意为美国风格的日期(CAST and CONVERT (Transact-SQL)

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

© www.soinside.com 2019 - 2024. All rights reserved.