Saya pikir Anda terlalu memperumit masalah.
Anda dapat menggunakan GROUP BY (DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30
untuk pengelompokan setiap 30 menit. Tentu saja, tanggal yang saya pilih hanyalah tanggal acak. Anda dapat memilih, jika Anda mau, tanggal pertama (atau terakhir) dalam data sampel Anda.
Dan Anda juga dapat menggunakan teknik ini untuk mendapatkan setiap interval dari setiap bagian waktu - cukup ubah kata kunci MINUTE
ke bagian tanggal mana pun yang ingin Anda gunakan, dan intreval 30
ke interval yang Anda inginkan.
Perhatikan contoh data berikut:
;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
sekarang berisi data berikut:
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
Untuk mendapatkan rn maksimum yang dikelompokkan berdasarkan 30 menit, Anda hanya perlu ini:
SELECT DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30, MAX(rn)
FROM #T
GROUP BY DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30
Hasil:
interval max_rn
0 29
1 59
2 60