Для SQL Server 2012, хотя я считаю, что он будет работать в SQL Server 2008R2, я использую следующий подход, чтобы сократить время до миллисекунды:
DATEADD(MILLISECOND, -DATEDIFF(MILLISECOND, CAST(time AS DATE), time) % @msPerSlice, time)
Работает:
- Получение количества миллисекунд между фиксированной точкой и целевым временем:
@ms = DATEDIFF(MILLISECOND, CAST(time AS DATE), time)
- Взяв остаток от деления этих миллисекунд на временные интервалы:
@rms = @ms % @msPerSlice
- Добавление отрицательного значения этого остатка к целевому времени для получения времени среза:
DATEADD(MILLISECOND, -@rms, time)
К сожалению, так как это переполняется микросекундами и меньшими единицами, таким образом, более крупные, более тонкие наборы данных должны использовать менее удобную фиксированную точку.
Я не проводил строгих сравнительных тестов, и у меня нет больших данных, поэтому ваш пробег может отличаться, но производительность была не намного хуже, чем у других методов, опробованных на нашем оборудовании и наборах данных, а также за удобство для разработчиков для произвольной нарезки делает это стоящим для нас.