Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按月份名称筛选_Sql_Sql Server_Sql Server 2005 - Fatal编程技术网

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之间(对于一月到四月)。