你可以这样做:
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;
这会给你类似的东西:
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
这是如何运作的?
我使用了一个数字从 0 到 9 的临时表作为锚表:
SELECT n
FROM (VALUES(0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) Nums(n)
要生成从 0 到 99 的数字:
Numbers
AS
(
SELECT n = t2.n * 10 + t1.n + 0
FROM Temp t1
CROSS JOIN Temp t2
)
我使用此表Numbers
生成从@startDate
到的时间间隔@endDate
,我假设两个日期之间的差异不会超过 99 分钟的间隔。如果您想让查询适用于大于 99 的更多范围,只需将表 temp 交叉连接更多次以生成更多数字。后来我使用这些生成的数字来生成日期时间间隔,每个数字之间有 10 分钟的间隔。之后,我将这个生成的表与Events
事件日期字段上的表连接起来。有了一个GROUP BY
,COUNT
我们就完成了。
请注意:我没有检查使用两个参数传递给查询的日期差是否@startDate
可以@EndDate
被 10 分钟整除,我认为您可能需要在您的情况下检查这一点,我将把它作为作业留给你。
这可能需要做很多工作,但我没有找到不使用光标的简单方法