如何在 sql server 中获取最近 3 个月的名称
Posted
技术标签:
【中文标题】如何在 sql server 中获取最近 3 个月的名称【英文标题】:How to get last 3 month name in sql server 【发布时间】:2015-11-25 06:49:27 【问题描述】:我的查询是
SELECT CONVERT(CHAR, DATENAME(MONTH, IssueDate)) AS MonthName,
ItemId,
COUNT(CONVERT(VARCHAR, IssueDate, 6)) AS WorkingDays
FROM dbo.Issue AS Issue
GROUP BY
CONVERT(CHAR, DATENAME(MONTH, IssueDate)),
ItemId
HAVING (ItemId = 427)
查询明智的展示
但我需要
请大家尽快解决这个问题。
【问题讨论】:
我猜你说最后 3 个月你的意思是一年的最后一个季度 如果是这种情况,您可以使用datepart(quarter,issuedate) = 4
是的,我也关心“最近3个月”这个要求,是今年最后一个季度吗?或者可以在表格中找到的最近 3 个月。例如:该表只有 JAN、FEB、MAR、APR 数据,所以最近 3 个月应该是 FEB、MAR 和 APR?或如何?请澄清。
【参考方案1】:
对不起@Imrul Kaesh,查询中有一些错误。我没有按 ItemId 过滤过去 3 个月。
我已将我的查询更新如下,请试一试:
WITH Last3Month AS
(
SELECT DISTINCT TOP 3 MONTH(IssueDate) AS Mth
FROM Issue
WHERE ItemId = 452 --Please add this WHERE Clause
ORDER BY Mth DESC
)
SELECT CONVERT(CHAR, DATENAME(MONTH, IssueDate)) AS MonthName,
ItemId,
COUNT(CONVERT(varchar, IssueDate, 6)) AS WorkingDays
FROM dbo.Issue AS Issue
INNER JOIN Last3Month ON MONTH(Issue.IssueDate) = Last3Month.Mth
GROUP BY CONVERT(CHAR, DATENAME(MONTH, IssueDate)), ItemId, Last3Month.Mth
HAVING (ItemId = 452)
ORDER BY Last3Month.Mth
【讨论】:
感谢@Doraemon,您的最后一个答案现在可以使用。亲爱的兄弟。现在告诉我-它是IssueDate
明智的如何展示?当发出明智的呼叫时,某些项目不会显示。如 (ItemID=452 仅在 10 月 月显示,但需要 10 月和 9 月 --------------------- --- N.B. 它不能以任何方式(视图、过程)像你一样。【参考方案2】:
试试下面的查询
SELECT DATENAME(MONTH,IssueDate) AS [MonthName],
ItemId,
COUNT(CONVERT(varchar, IssueDate, 6)) AS WorkingDays
FROM [dbo].[Issue]
WHERE IssueDate >= DATEADD (MM,-3,IssueDate)
GROUP BY DATENAME(MONTH,IssueDate), ItemId
HAVING (ItemId = 427)
【讨论】:
对不起,我不认为这是工作。所有单个数据的 where 条件都为真。例如:一个数据的IssueDate
是28/08/2015,DATEADD (MM,-3,IssueDate)
是28/05/2015,这对于逻辑IssueDate >= DATEADD (MM,-3,IssueDate)
是正确的。对于所有数据也是如此。 .
嘿@Doraemon,现在显示 4 个月。 WITH Last3Month AS(SELECT DISTINCT TOP(3)MONTH(IssueDate) AS Mth FROM Issue AS Issue_1 ORDER BY Mth DESC)SELECT CONVERT(CHAR, DATENAME(MONTH, Issue.IssueDate)) AS MonthName, Issue.ItemId, Last3Month_1.Mth FROM Issue AS Issue LEFT OUTER JOIN Last3Month AS Last3Month_1 ON MONTH(Issue.IssueDate) = Last3Month_1.Mth GROUP BY CONVERT(CHAR, DATENAME(MONTH, Issue.IssueDate)), Issue.ItemId, Last3Month_1.Mth HAVING (Issue.ItemId = 430)
因为这是LEFT OUTER JOIN
。但我不包括 LEFT OUTER JOIN
然后最大项目显示 2 个月。请解决这个问题。
@Imrul Kaesh 这里有几个问题: 1. 你有不同年份的记录吗? 2. 你不需要计算工时吗?您能否提供您的数据集,以便我查看结果?由于我使用的是自己的测试数据,所以可能会有一些不同。谢谢。
@Doraemon,如何提供我的数据?请给我您的邮件 ID 或任何方式
@Doraemon,请检查我在谷歌驱动器上的数据库 (drive.google.com/file/d/0B_k-gFpZlM3JYkVfT1Z6dmJiUEk/…)【参考方案3】:
我不确定这是否适合您。我只是简单地创建一个与您的情况类似的表并在我这边进行测试。 请试一试。
WITH Last3Month AS
(
SELECT DISTINCT TOP 3 MONTH(IssueDate) AS Mth
FROM Issue
ORDER BY Mth DESC
)
SELECT CONVERT(CHAR, DATENAME(MONTH, IssueDate)) AS MonthName,
ItemId,
COUNT(CONVERT(varchar, IssueDate, 6)) AS WorkingDays
FROM dbo.Issue AS Issue
INNER JOIN Last3Month ON MONTH(Issue.IssueDate) = Last3Month.Mth
GROUP BY CONVERT(CHAR, DATENAME(MONTH, IssueDate)), ItemId, Last3Month.Mth
HAVING (ItemId = 427)
ORDER BY Last3Month.Mth
【讨论】:
先生。哆啦A梦,谢谢你的帮助。 嗨@Imrul Kaesh,如果这是您正在寻找的答案,请将其标记为答案,以便其他人可以参考。谢谢。【参考方案4】:好的 @Imrul Kaesh 你现在有什么问题?
根据您提供的数据集,我使用查询选择了 ItemId=427 和 ItemId=430 的最近 3 个月记录。结果如下:
请记住,您只能使用 INNER JOIN 而不能使用 LEFT OUTER JOIN。谢谢。
【讨论】:
请尝试 ItemId=452 和 460,即无法正确显示数据。【参考方案5】:我在查询下方得到只有月份名称 -
SELECT DATENAME(MONTH, dt) AS Monthnames, ItemId
FROM (SELECT DISTINCT TOP (3) DATEADD(MONTH, DATEDIFF(MONTH, 0, IssueDate), 0) AS dt, ItemId
FROM dbo.Issue
WHERE (ItemId = 452)
ORDER BY dt DESC) AS t
Now show this
但我需要 ItemID、ItemName、WorkingDays、IssueQty 和 MonthNames my need this format
【讨论】:
以上是关于如何在 sql server 中获取最近 3 个月的名称的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Server 中获取上个月的昨天日期?有人可以帮我解决这个问题吗?
从十进制 (8, 0) 格式的日期获取 n-3 或 n-x 个月(约 90 天前),在 SQL Server 和 DB2 中具有年份变化影响