Myślę, że zbytnio komplikujesz sprawy.
Możesz użyć GROUP BY (DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30
za grupowanie co 30 minut. Oczywiście wybrana przeze mnie data jest przypadkowa. Możesz wybrać, jeśli chcesz, pierwszą (lub ostatnią) datę w przykładowych danych.
Możesz również użyć tej techniki, aby uzyskać każdy interwał z dowolnej części czasu - po prostu zmień słowo kluczowe MINUTE do dowolnej części daty, której chcesz użyć, oraz przedziału
30
w dowolnym przedziale.
Rozważ następujące przykładowe dane:
;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
teraz zawiera następujące dane:
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
Aby uzyskać maksymalny rn pogrupowany według 30 minut, potrzebujesz tylko tego:
SELECT DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30, MAX(rn)
FROM #T
GROUP BY DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30
Wyniki:
interval max_rn
0 29
1 59
2 60