如何在 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 tNow show this

但我需要 ItemID、ItemName、WorkingDays、IssueQty 和 MonthNames my need this format

【讨论】:

以上是关于如何在 sql server 中获取最近 3 个月的名称的主要内容,如果未能解决你的问题,请参考以下文章

获取最近 3 个月数据的 SQL 查询

如何在SQL中获取当前日期最近六个月的前一个月数据

如何在 SQL Server 中获取一个季度的上个月数据?

如何在 SQL Server 中获取上个月的昨天日期?有人可以帮我解决这个问题吗?

如何在日期分区中获取最近 3 个月

从十进制 (8, 0) 格式的日期获取 n-3 或 n-x 个月(约 90 天前),在 SQL Server 和 DB2 中具有年份变化影响