シンを複雑にしすぎていると思います。GROUP BY(DATEDIFF(MINUTE、 '2017-01-01'、TheDateTime)/ 30
を使用できます 30分ごとにグループ化するため。もちろん、私が選んだ日付はランダムな日付です。必要に応じて、サンプルデータの最初(または最後)の日付を選択できます。
また、この手法を使用して、任意の時間部分のすべての間隔を取得することもできます。キーワードMINUTEを変更するだけです。コード> 使用したい日付部分、およびintreval
30
好きな間隔に。
次のサンプルデータを検討してください。
;WITH CTE AS
(
SELECT CAST('2017-01-01T00:00:00' as datetime) As TheDateTime, 0 as rn
UNION ALL
SELECT DATEADD(MINUTE, 1, TheDateTime), rn + 1
FROM CTE
WHERE rn < 60
)
SELECT TheDateTime, rn INTO #T
FROM CTE
OPTION(MAXRECURSION 0)
#T
現在、次のデータが含まれています:
TheDateTime rn
2017-01-01 00:00:00.000 0
2017-01-01 00:01:00.000 1
2017-01-01 00:02:00.000 2
2017-01-01 00:03:00.000 3
...
2017-01-01 00:59:00.000 59
2017-01-01 01:00:00.000 60
30分ごとにグループ化された最大rnを取得するには、次のようにする必要があります。
SELECT DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30, MAX(rn)
FROM #T
GROUP BY DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30
結果:
interval max_rn
0 29
1 59
2 60