2

我在查询中有一个日期字段,我确实想得到这样的 GROUP BY 报告:

DATE    COUNT
2010-01  10
2010-02  2
...
2010-12  24
2012-13  34

在 SQL Server 上获取此信息的正确语法是什么?

4

4 回答 4

7

所有这些到字符串的转换都有效,但我发现这种方法更有效,尽管可读性较差:

SELECT m = DATEADD(MONTH, DATEDIFF(MONTH, 0, [DATE]), 0), COUNT(*)
  FROM dbo.TheTable
  GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, [DATE]), 0); 

如果您不想重复表达式,则:

;WITH x AS (SELECT m = DATEADD(MONTH, DATEDIFF(MONTH, 0, [DATE]), 0)
  FROM dbo.TheTable)
SELECT m, COUNT(*)
  FROM x GROUP BY m;

这样,输出仍然是日期/时间值,并且可以以这种方式用于其他事情。而且它不涉及任何混乱的字符串转换。

于 2012-06-26T19:30:43.307 回答
2

你可以简单地做:

select convert(char(7), @myDate, 20)

例子

declare @myDate as DateTime
set @myDate = '2012-06-23'
select convert(char(7), @myDate, 20)

输出

-------
2012-06

所以完整的声明看起来像:

select convert(char(7), myDate, 20), count(*) as Count
from MyTable
group by convert(char(7), myDate, 20)

更新

样本数据包括 value 2012-13。我假设这是一个错字,破折号后面的数字代表月份。

于 2012-06-26T19:25:19.293 回答
2
 CONVERT(VARCHAR(7), CreationDate, 120) as Date
于 2012-06-26T19:27:23.803 回答
-2
SELECT CAST(DATEPART(year, dateCol) as VARCHAR) + '-' + CAST(DATEPART(month, dateCol) as VARCHAR) as Date, count(*) As Count
FROM myTable
GROUP BY CAST(DATEPART(year, dateCol) as VARCHAR) + '-' + CAST(DATEPART(month, dateCol) as VARCHAR)
于 2012-06-26T19:10:04.483 回答