获取DateTime的T-SQL代码仅包含任何DateTime的Month和Year

时间:2009-10-01 15:31:57

标签: sql sql-server tsql datetime

如果一个表Event包含一个名为EventTime的DateTime类型的字段,并且该值将包含日期和时间元素,我需要创建一个汇总查询,该查询计算每个月的事件数量

分组依据字段的结果类型也必须是具有0时间元素的日期时间,并设置为该月的第1天。

这是我迄今为止所拥有的,但它不是很优雅,我不确定它特别有效。

  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)))

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

4 个答案:

答案 0 :(得分: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 :(得分: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)

答案 2 :(得分:0)

您可以使用MONTH(GetDate()) T-SQL函数。

你还试图从日期时间开始抽出时间吗?

如果是这样,试试这个:

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

它更清洁,更具可读性。

答案 3 :(得分: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)