あなたはこれを行うことができます:
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
の時間間隔を生成するためにこの表を使用しました。2 つの日付の差は 99 分間隔を超えないと仮定しました。クエリを 99 を超える範囲で機能させたい場合は、テーブル temp をさらに複数回クロス結合して、より多くの数値を生成します。後で、これらの生成された数値を使用して、それぞれの間隔が 10 分である日時間隔を生成しました。その後、この生成されたテーブルをイベント日付フィールドのテーブルと結合しました。で、完了です。@startDate
@endDate
Events
GROUP BY
COUNT
注:@startDate
2つのパラメーターを使用してクエリに渡された日付の差が@EndDate
10分で割り切れるかどうかは確認していません。あなたの場合はこれを確認する必要があると思います。宿題として残しますあなた。
これは大変な作業かもしれませんが、カーソルを使わずにこれを行う簡単な方法が見つかりませんでした