Ik denk dat je het te ingewikkeld maakt.
Je kunt GROUP BY (DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30
gebruiken om elke 30 minuten te groeperen. Natuurlijk is de datum die ik heb gekozen een willekeurige datum. U kunt, als u wilt, de eerste (of laatste) datum in uw voorbeeldgegevens kiezen.
En u kunt deze techniek ook gebruiken om elk interval van elk tijdsdeel te krijgen - verander gewoon het trefwoord MINUTE
naar elk datumgedeelte dat u wilt gebruiken, en de intreval 30
naar elk gewenst interval.
Bekijk de volgende voorbeeldgegevens:
;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
bevat nu de volgende gegevens:
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
Om de maximale rn gegroepeerd op 30 minuten te krijgen, heb je dit nodig:
SELECT DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30, MAX(rn)
FROM #T
GROUP BY DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30
Resultaten:
interval max_rn
0 29
1 59
2 60