Myslím, že to zbytečně komplikujete.
Můžete použít GROUP BY (DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30
pro seskupování po každých 30 minutách. Datum, které jsem zvolil, je samozřejmě jen náhodné. Pokud chcete, můžete si vybrat první (nebo poslední) datum ve vzorových datech.
Tuto techniku můžete také použít k získání každého intervalu jakékoli časové části – stačí změnit klíčové slovo MINUTE na jakoukoli část data, kterou chcete použít, a interval
30
na libovolný interval.
Zvažte následující ukázková data:
;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
nyní obsahuje následující data:
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
Chcete-li získat maximální rn seskupené po 30 minutách, potřebujete toto:
SELECT DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30, MAX(rn)
FROM #T
GROUP BY DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30
Výsledky:
interval max_rn
0 29
1 59
2 60