我正在尝试使用 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年使用的服务器?
答案 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
的文字字符串,则可以使用样式代码CONVERT
:101
将CONVERT(date,'12/31/2019',101)
换行。 101
表示美国风格的日期(CAST and CONVERT (Transact-SQL)。
请记住,此解决方案假定,您只有日期值,而没有日期和时间值。如果这样做(具有日期和时间值),则需要使用适当的日期和时间数据类型,并使用ISO8601样式而不是ISO样式。