Ich denke, Sie verkomplizieren das Ganze zu sehr.
Sie können GROUP BY (DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30
verwenden zum Gruppieren nach alle 30 Minuten. Natürlich ist das Datum, das ich gewählt habe, nur ein zufälliges Datum. Sie können, wenn Sie möchten, das erste (oder letzte) Datum in Ihren Beispieldaten auswählen.
Und Sie können diese Technik auch verwenden, um jedes Intervall eines beliebigen Zeitabschnitts zu erhalten - ändern Sie einfach das Schlüsselwort MINUTE
zu einem beliebigen Datumsteil, den Sie verwenden möchten, und das Intervall 30
zu jedem gewünschten Intervall.
Betrachten Sie die folgenden Beispieldaten:
;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
enthält nun folgende Daten:
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
Um die maximale rn nach 30 Minuten gruppiert zu erhalten, brauchen Sie nur Folgendes:
SELECT DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30, MAX(rn)
FROM #T
GROUP BY DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30
Ergebnisse:
interval max_rn
0 29
1 59
2 60