按月名称过滤

时间:2011-06-22 08:31:46

标签: sql sql-server sql-server-2005

我想基于几个月检索数据。我希望在两个月之后得到工作表数据是我的查询,但它不能正常工作。

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月,然后它显示了正确的记录,因为有行军数据。四月为什么它没有显示任何东西?

请提出你的建议。

感谢。

5 个答案:

答案 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'

并且非常快速地获得这些行 - 特别是如果您索引此列。