如何使用sql从Date字段按月分组

use*_*332 72 sql t-sql sql-server

如何从日期字段中按月分组(而不是按日分组)?

这是我的日期字段的样子:

2012-05-01
Run Code Online (Sandbox Code Playgroud)

这是我目前的SQL:

select  Closing_Date, Category,  COUNT(Status)TotalCount from  MyTable
where Closing_Date >= '2012-02-01' and Closing_Date <= '2012-12-31'
and Defect_Status1 is not null
group by  Closing_Date, Category
Run Code Online (Sandbox Code Playgroud)

Gar*_*thD 87

我会用这个:

SELECT  Closing_Date = DATEADD(MONTH, DATEDIFF(MONTH, 0, Closing_Date), 0), 
        Category,  
        COUNT(Status) TotalCount 
FROM    MyTable
WHERE   Closing_Date >= '2012-02-01' 
AND     Closing_Date <= '2012-12-31'
AND     Defect_Status1 IS NOT NULL
GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, Closing_Date), 0), Category;
Run Code Online (Sandbox Code Playgroud)

这将按每月的第一天分组,所以

`DATEADD(MONTH, DATEDIFF(MONTH, 0, '20130128'), 0)` 
Run Code Online (Sandbox Code Playgroud)

会给'20130101'.我通常更喜欢这种方法,因为它将日期保留为日期.

或者你可以使用这样的东西:

SELECT  Closing_Year = DATEPART(YEAR, Closing_Date),
        Closing_Month = DATEPART(MONTH, Closing_Date),
        Category,  
        COUNT(Status) TotalCount 
FROM    MyTable
WHERE   Closing_Date >= '2012-02-01' 
AND     Closing_Date <= '2012-12-31'
AND     Defect_Status1 IS NOT NULL
GROUP BY DATEPART(YEAR, Closing_Date), DATEPART(MONTH, Closing_Date), Category;
Run Code Online (Sandbox Code Playgroud)

这取决于你想要的输出.(在您的示例中不需要结算年份,但如果日期范围跨越年份边界,则可能是).

  • @irfandar 0不是日期,但是SQL-Server隐式地将它转换为1900年1月1日.对于你的第二个问题,`Closing_Date =`只是列别名,它与表达式后面的'AS Closing_Date`相同.这完全是主观的,但我个人觉得`alias =`符号比`AS Alias`更容易阅读.有关我更喜欢它的原因[请阅读本文](http://sqlblog.com/blogs/aaron_bertrand/archive/2012/01/23/bad-habits-to-kick-using-as-instead-of-for -alumn-aliases.aspx)作者:Aaron Bertrand. (2认同)

Bog*_*SFT 37

使用DATEPART函数从日期中提取月份.

所以你会做这样的事情:

SELECT DATEPART(month, Closing_Date) AS Closing_Month, COUNT(Status) AS TotalCount
FROM t
GROUP BY DATEPART(month, Closing_Date)
Run Code Online (Sandbox Code Playgroud)

  • 对于Mysql,您可以使用MONTH()或MONTHNAME()而不是DATEPART (10认同)
  • 这将考虑不同年份的月份相同-通常是无法预期的。 (5认同)

And*_*ura 9

我用FORMAT函数来完成这个:

select
 FORMAT(Closing_Date, 'yyyy_MM') AS Closing_Month
 , count(*) cc 
FROM
 MyTable
WHERE
 Defect_Status1 IS NOT NULL
 AND Closing_Date >= '2011-12-01'
 AND Closing_Date < '2016-07-01' 
GROUP BY FORMAT(Closing_Date, 'yyyy_MM')
ORDER BY Closing_Month
Run Code Online (Sandbox Code Playgroud)


A W*_*A W 6

通过增加MONTH(date_column)GROUP BY

SELECT Closing_Date, Category,  COUNT(Status)TotalCount
FROM   MyTable
WHERE  Closing_Date >= '2012-02-01' AND Closing_Date <= '2012-12-31'
AND    Defect_Status1 IS NOT NULL
GROUP BY MONTH(Closing_Date), Category
Run Code Online (Sandbox Code Playgroud)