在sql server中获取去年的最后3个月
我想从当前月份获取最近3个月的名称。例如,当前月份是12月。所以,我想要像这样的十月,十一月和十二月 这是我的疑问:在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) 这将返回: 但是,我需要:
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