2009-10-01 44 views
2

如果表Event包含DateTime类型的EventTime字段,并且该值将同时包含日期和时间元素,则需要创建一个汇总查询统计每个月的事件数量。从任何日期时间获取DateTime的T-SQL代码只包含Month和Year

“分组依据”字段的结果类型还必须是带有0时间元素的日期时间,并设置为月份的第一天。

这是我迄今为止,但它不是很优雅,我不知道它特别有效。

SELECT COUNT(1) AS [CountOfEvents], 
     DATEADD(d, 1 - DAY(EventTime), DATEADD(dd, 0, DATEDIFF(dd, 0, EventTime))) AS [Month] 
    FROM [Event] 
GROUP BY DATEADD(d, 1 - DAY(EventTime), DATEADD(dd, 0, DATEDIFF(dd, 0, EventTime))) 

更好的建议为更多的效率或优雅?

回答

10

这个楼层月:

select dateadd(month,datediff(m,0,GETDATE()),0); 

输出:

----------------------- 
2009-10-01 00:00:00.000 

(1 row(s) affected) 

所以试试这个:

SELECT 
    COUNT(*) as CountOF 
    ,dateadd(month,datediff(m,0,EventTime),0) 
    FROM [Event] 
    GROUP BY dateadd(month,datediff(m,0,EventTime),0) 
    ORDER BY 2 
+1

关键是按您感兴趣的单位(在这种情况下是月份)发布,请参阅此链接:http://stackoverflow.com/questions/85373/floor-a-date-in-sql-server/85379# 85379 – 2009-10-01 15:49:16

+0

ORDER BY 2的目的是什么? – AnthonyWJones 2009-10-01 15:51:24

+1

它将按第二列对查询进行排序。当我在我的系统上运行这个查询时,很难检查结果,所以我对它们进行了排序。当我把它粘贴在这里时,我刚刚离开那里。如果你不需要它,请删除。 – 2009-10-01 15:53:45

0

有一个MONTH(GetDate())您可以使用的T-SQL函数。

你也只是试图从日期时间去除时间?

如果是的话,试试这个:

DATEADD(d, DATEDIFF(d, 0, GetDate()), 0) 

这是一个有点清洁,更具可读性。

+0

谢谢我将时间剥离,这是我表达的元素(仔细看看你能看到它),但是我不想剥夺那一年,我只想把这一天设置为第一天。所以MONTH函数并不是那么有用。 – AnthonyWJones 2009-10-01 15:38:29

1
SELECT 
    COUNT(1) AS [CountOfEvents], 
    DATEADD(month, DATEDIFF(month, 0, [EventTime]), 0) AS [Month] 
FROM [Event] 
GROUP BY DATEADD(month, DATEDIFF(month, 0, [EventTime]), 0) 
+0

+1不错,优雅高效 – AnthonyWJones 2009-10-01 15:48:07

0

可能这更是 '可读':

SELECT 
COUNT(1) AS [CountOfEvents], 
CONVERT(datetime, CONVERT(varchar, EventTime, 112)) + 1 - DAY(EventTime) AS [Month] 
FROM [Event] 
GROUP BY CONVERT(datetime, CONVERT(varchar, EventTime, 112)) + 1 - DAY(EventTime) 
相关问题