在sql server中获取去年的最后3个月

在sql server中获取去年的最后3个月,sql,sql-server,sql-server-2008,sql-server-2005,Sql,Sql Server,Sql Server 2008,Sql Server 2005,我想从当前月份获取最近3个月的名称。例如,当前月份是12月。所以,我想要像这样的十月,十一月和十二月 这是我的疑问: SELECT CONVERT(CHAR, DATENAME(MONTH, IssueDate)) AS MonthName, ItemId FROM dbo.Issue AS Issue GROUP BY CONVERT(CHAR, DATENAME(MONTH, IssueDate)), ItemId HAVING (ItemId = 427) 这将返回: 但是,我需要:

我想从当前月份获取最近3个月的名称。例如,当前月份是12月。所以,我想要像这样的十月,十一月和十二月

这是我的疑问:

SELECT CONVERT(CHAR, DATENAME(MONTH, IssueDate)) AS MonthName, ItemId
FROM dbo.Issue AS Issue
GROUP BY CONVERT(CHAR, DATENAME(MONTH, IssueDate)), ItemId
HAVING (ItemId = 427)
这将返回:

但是,我需要:

注意:当12月关闭,1月打开时,10月自动排除,如11月、12月和1月


这个链接是我的数据库,只有2个表大小-243KB,在谷歌硬盘上有Ziphttps://goo.gl/S4m0R5

在where子句中添加日期差异,以过滤到最近3个月,然后在末尾按月数排序:

SELECT CONVERT(CHAR, DATENAME(MONTH, [IssueDate])) AS MonthName, ItemId
FROM  [dbo].[Issue] AS Issue
WHERE datediff(m, [IssueDate], getdate()) between 0 and 2
GROUP BY CONVERT(CHAR, DATENAME(MONTH, [IssueDate])), ItemId, MONTH(IssueDate)
HAVING (ItemId= 427)
order by MONTH(IssueDate);

您可以使用DATEADD函数:

WHERE IssueDate >= dateadd( month, -2, dateadd( day, -datepart( day, getdate() ) + 1, cast( getdate() as date ) ) )
这将为您提供IssueDate>='2015-10-01'今天提供

这也适用于IssueDate上的索引,如果您开始在IssueDate上执行DATEADD/DATEDIFF等操作,则只能端到端扫描索引,因为它需要处理表中的所有行,因此索引的效率明显降低

DECLARE @t TABLE
(
    IssueDate DATETIME,
    ItemId INT
)

INSERT INTO @t (IssueDate, ItemId)
VALUES
    ('20160105', 427),
    ('20151212', 427),
    ('20151213', 427),
    ('20151110', 427),
    ('20151001', 427),
    ('20150905', 427)

SELECT DATENAME(MONTH, dt)
FROM (
    SELECT DISTINCT TOP(3) DATEADD(MONTH, DATEDIFF(MONTH, 0, IssueDate), 0) AS dt
    FROM @t
    WHERE ItemId = 427
    ORDER BY dt DESC
) t
结果-

------------------------------
January
December
November

您可以使用递归CTE获取过去12个月的月份名称,然后在查询的第二部分中将其限制为最后3个月的名称:

;WITH months(MonthNumber) AS
(
   SELECT 0
   UNION ALL
   SELECT MonthNumber+1 
   FROM months
   WHERE MonthNumber < 12
)
SELECT DATENAME(MONTH,DATEADD(MONTH,-MonthNumber,GETDATE())) AS [month]
FROM dbo.Issue AS Issue
CROSS JOIN months m
WHERE m.MonthNumber <3
GROUP BY DATENAME(MONTH,DATEADD(MONTH,-MonthNumber,GETDATE())) , ItemId
HAVING (ItemId = 427)

亲爱的@Devart,您的查询没有问题。但是,我需要这个结果-plz c谷歌deive上的这个结果。请尽快解决这个问题。请在谷歌硬盘上用Zip检查我的数据库大小-243KB