Sql 按月份名称筛选
我想以月份为基础检索数据。我想得到两个月之间的工作表数据,这是我的查询,但它不能正常工作Sql 按月份名称筛选,sql,sql-server,sql-server-2005,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 O
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
而不是Apr。然后它显示了正确的记录,因为有三月的数据。四月份为什么什么都没有
请给出你的建议
谢谢 我想它不喜欢你在字符串之间使用的事实;字符串'Apr'在字符串'Jan'之前,因此不起作用,但字符串'Mar'在字符串'Jan'之后。我想它不喜欢您在字符串之间使用的事实;字符串'Apr'位于字符串'Jan'之前,因此不起作用,但字符串'Mar'位于字符串'Jan'之后。您可以使用1到4之间的月(w.ExpectedStartDate)您可以使用1到4之间的月(w.ExpectedStartDate)
和月(w.ExpectedStartDate)>=1和月(w.ExpectedStartDate)和月(w.ExpectedStartDate)>=1和月(w.ExpectedStartDate)为确保准确性,请使用此代码
AND MONTH(w.ExpectedStartDate)>=1 AND MONTH(w.ExpectedStartDate)<=4
w.ExpectedStartDate>='20110101' and ExpectedStartDate<'20110105'
w.ExpectedStartDate>='20110101'和ExpectedStartDate为确保准确性,请使用此代码
w.ExpectedStartDate>='20110101' and ExpectedStartDate<'20110105'
w.ExpectedStartDate>='20110101'和ExpectedStartDate如果您需要经常执行此查询,您还可以调查持久化计算列,例如:
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'
并快速准确地获取这些行—特别是如果您为该列编制索引。如果您需要频繁执行此查询,您还可以调查持久化计算列—例如:
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'
并且非常快地准确地得到这些行,特别是如果你为这个列编制索引的话。我会使用DATEPART而不是DATENAME来得到一个表示月份的整数,Jan=1,Feb=2,等等。所以你的where子句将变成其中w.ProjectId=20和DATEPART(month,w.ExpectedStartDate)介于1和4之间(对于一月到四月)。我会使用DATEPART而不是DATENAME来获取表示月份的整数,Jan=1、Feb=2等。因此,where子句将变为,其中w.ProjectId=20,DATEPART(month,w.ExpectedStartDate)介于1和4之间(对于一月到四月)。