我想基于几个月检索数据。我希望在两个月之后得到工作表数据是我的查询,但它不能正常工作。
SELECT (CONVERT(varchar(3), DATENAME(month, w.ExpectedStartDate)) + '-' + CONVERT(VARCHAR(15), datepart(yyyy, w.ExpectedStartDate))) as MonthName
FROM Worksheet w LEFT OUTER JOIN StatusType st ON st.StatusTypeId = w.StatusTypeId
WHERE w.ProjectId = 20
AND CONVERT(varchar(3), DATENAME(month, w.ExpectedStartDate)) between ('Jan') AND ('Apr')
当我将其转换为此时:
SELECT (CONVERT(varchar(3), DATENAME(month, w.ExpectedStartDate)) + '-' + CONVERT(VARCHAR(15), datepart(yyyy, w.ExpectedStartDate))) as MonthName
FROM Worksheet w LEFT OUTER JOIN StatusType st ON st.StatusTypeId = w.StatusTypeId
WHERE w.ProjectId = 20
AND CONVERT(varchar(3), DATENAME(month, w.ExpectedStartDate)) between ('Jan') AND ('Mar')
我刚刚更改了ToMonth = Mar
而不是4月,然后它显示了正确的记录,因为有行军数据。四月为什么它没有显示任何东西?
请提出你的建议。
感谢。
答案 0 :(得分:3)
我想它不喜欢BETWEEN与字符串一起使用的事实;字符串'Apr'出现在字符串'Jan'之前,因此它不起作用,但字符串'Mar'出现在字符串'Jan'之后。
答案 1 :(得分:0)
您可以在1到4之间使用月(我们预期的开始日期)
答案 2 :(得分:0)
AND MONTH(w.ExpectedStartDate)>=1 AND MONTH(w.ExpectedStartDate)<=4
答案 3 :(得分:0)
准确度使用此代码
w.ExpectedStartDate>='20110101' and ExpectedStartDate<'20110105'
答案 4 :(得分:0)
如果您需要经常进行此查询,您还可以调查持久计算列 - 例如类似的东西:
ALTER TABLE dbo.Worksheet
ADD YearMonth AS
RIGHT('0000' + CAST(YEAR(ExpectedStartDate) AS VARCHAR(4)), 4) +
RIGHT('00' + CAST(MONTH(ExpectedStartDate) AS VARCHAR(2)), 2) PERSISTED
这会在您的表格中添加一个新列YearMonth
,该列始终是最新的,始终准确,并且保持不变,例如存储在磁盘上所以它很快,你甚至可以在该列上放一个索引!
该列将包含诸如
之类的值201103
201104
依此类推 - ExpectedStartDate
因此,要选择2011年1月的所有项目,您可以定义:
SELECT (list of columns)
FROM dbo.Worksheet
WHERE YearMonth = '201101'
并且非常快速地获得这些行 - 特别是如果您索引此列。