Мисля, че прекалявате с усложняването.
Можете да използвате GROUP BY (DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30
за групиране на всеки 30 минути. Разбира се, датата, която избрах, е случайна. Можете да изберете, ако желаете, първата (или последната) дата във вашите примерни данни.
И можете също да използвате тази техника, за да получите всеки интервал от всяка част от времето - просто променете ключовата дума MINUTEкод> до всяка част от датата, която искате да използвате, и интервала
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
За да получите максималния rn, групиран по 30 минути, трябва само това:
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