Pet*_*sen 2 sql sql-server datetime sql-server-2008
我在SQL Server中有一个表,用于存储事件和datetime事件.我现在希望将这些事件分组为例如10分钟的间隔,显示每组中有多少事件.
我正在寻找类似于以下的结果.有没有人有一个例子og如何做到这一点?
FromTIme | ToTime | Number of Events
-----------------------------------------------------------------------
2012-12-03 00:00:00.000 | 2012-12-03 00:10:00.000 | 5
2012-12-03 00:10:00.000 | 2012-12-03 00:20:00.000 | 15
Run Code Online (Sandbox Code Playgroud)
查询将在报告中使用,因此我希望能够设置@StartDate和@EndDate间隔.
你可以这样做:
DECLARE @startDate DATETIME = '2012-12-03 00:00:00.000';
DECLARE @endDate DATETIME = '2012-12-03 00:20:00.000';
DECLARE @counter INT = 1;
DECLARE @nOfIntervals INT = DATEDIFF(minute, @startDate, @endDate) / 10;
;WITH Temp
AS
(
SELECT n
FROM (VALUES(0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) Nums(n)
), Numbers
AS
(
SELECT n = t2.n * 10 + t1.n + 0
FROM Temp t1
CROSS JOIN Temp t2
), FromToCTE
AS
(
SELECT
DATEADD(minute, 10 * n, @startDate) FromDate,
DATEADD(minute, 10 *(n +1), @startDate) ToDate
FROM numbers
WHERE (n + 1) <= @nOfIntervals
),EventsFromTo
AS
(
SELECT
c.FromDate,
c.ToDate,
e.EventDate
FROM @Events e
INNER JOIN FromToCTE c ON e.EventDate BETWEEN c.FromDate AND c.ToDate
)
SELECT FromDate, ToDate, COUNT(*) "Number of Events"
FROM EventsFromTo
GROUP BY FromDate, ToDate;
Run Code Online (Sandbox Code Playgroud)
这会给你一些类似的东西:
FromDate ToDate Number of Events
2012-12-03 00:00:00 2012-12-03 00:10:00 5
2012-12-03 00:10:00 2012-12-03 00:20:00 15
Run Code Online (Sandbox Code Playgroud)
我使用了一个临时表,其中0到9之间的数字作为锚表:
SELECT n
FROM (VALUES(0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) Nums(n)
Run Code Online (Sandbox Code Playgroud)
要生成0到99之间的数字:
Numbers
AS
(
SELECT n = t2.n * 10 + t1.n + 0
FROM Temp t1
CROSS JOIN Temp t2
)
Run Code Online (Sandbox Code Playgroud)
我用这个表Numbers来生成从@startDate到的时间间隔@endDate,我假设两个日期之间的差异不会超过99分钟.如果要使查询适用于大于99的更多范围,只需将表格临时交叉连接更多次以生成更多数字.后来我使用这些生成的数字来生成日期时间间隔,每个间隔时间间隔为10分钟.之后,我将这个生成的表与Events事件日期字段中的表一起加入.随着GROUP BY和COUNT我们完成了.
需要注意的是:我没有检查的时间差是否传递给查询使用两个参数@startDate,并@EndDate是可分10分钟或没有,我想你可能需要在你的情况,以检查这一点,我会离开它作为一个功课您.
这可能是很多工作,但我没有找到一种简单的方法来不使用游标