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

时间:2019-03-08 20:39:49

标签: sql sql-server date-formatting

我正在尝试使用 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 个答案:

答案 0 :(得分: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的文字字符串,则可以使用样式代码CONVERT101CONVERT(date,'12/31/2019',101)换行。 101表示美国风格的日期(CAST and CONVERT (Transact-SQL)

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