Tsql 按具有StartingTimestamp和EndingTimestamp事件的范围内的每个日期分组

Tsql 按具有StartingTimestamp和EndingTimestamp事件的范围内的每个日期分组,tsql,sql-server-2008-r2,group-by,date-range,Tsql,Sql Server 2008 R2,Group By,Date Range,我想计算一月份内日历中的所有事件,并按日期进行分组。此事件具有StartingTimestamp和EndingTimestamp 例如,表rp.日历: StartingTimestamp EndingTimestamp Title 24.01.2014 08:00 24.01.2014 10:00 Meeting 25.01.2014 17:00 26.01.2014 08:00 Home time 24.01.2014

我想计算一月份内日历中的所有事件,并按日期进行分组。此事件具有StartingTimestamp和EndingTimestamp

例如,表rp.日历:

StartingTimestamp     EndingTimestamp      Title
24.01.2014 08:00      24.01.2014 10:00     Meeting
25.01.2014 17:00      26.01.2014 08:00     Home time
24.01.2014            26.01.2014           Holiday
26.01.2014 17:00      29.01.2014 08:00     Weekend
现在,我需要的结果是:

Date         Counter
24.01.2014   2
25.01.2014   2
26.01.2014   3
27.01.2014   1
28.01.2014   1
29.01.2014   1
这是你的答案:

SELECT CONVERT(varchar(10),StartingTimestamp,110) AS Date, Count(*) AS Counter
FROM YourTableName
GROUP BY CONVERT(varchar(10),StartingTimestamp,110)
将110更改为所需格式:

101 mm/dd/yy
102 yy.mm.dd
103 dd/mm/yy
104 dd.mm.yy
105 dd-mm-yy
106 dd mon yy
107 Mon dd, yy
108 hh:mm:ss
110 mm-dd-yy
111 yy/mm/dd
112 yymmdd

有关详细信息,请参见

这适用于1月或任何月份,但如果需要,可以调整更长的时间:

WITH January AS (
SELECT 1 AS n
UNION ALL
SELECT n+1 FROM January WHERE n+1<=31
)

SELECT n,COUNT(*)
FROM January
JOIN yourtable ON n BETWEEN datepart(d,StartingTimestamp)  AND datepart(d,EndingTimestamp)
GROUP BY n

这与我使用的解决方案类似,当时我只有一个日期事件。这给了我一个结果,周末事件只适用于一天26.01..快速解释:一月只是通过递归CTE生成的从1到31的数字的集合。此表使用“开始日期”和“结束日期”的“日期”部分连接到您的表中。要获得更通用的解决方案,您需要一个表,其中只有一列包含所有连续日期,那么您不需要CTE;在查询中使用该表而不是“一月”,并且,也可以使用整个日期来比较,而不是日期部分。您尝试过我提出的解决方案吗?如果你需要调整,请告诉我。你有什么反馈吗?