Intervalos de datas em T / SQL

Para um projeto atual em que estou trabalhando, preciso retornar um relatório agregado com base em intervalos de datas.

Eu tenho 3 tipos de relatórios, anuais, mensais e diários.

Para ajudar a devolver este relatório, preciso de uma função que retorne todos os subintervalos de tempos de dados, dentro de um grande intervalo.

Então, por exemplo, se eu como para todos os intervalos diários entre '2006-01-01 11:10:00' e '2006-01-05 08:00:00', eu esperaria os seguintes resultados.

select * 
from dbo.fnGetDateRanges('d', '2006-01-01 11:10:00', '2006-01-05 08:00:00')  

2006-01-01 11:10:00.000,    2006-01-02 00:00:00.000
2006-01-02 00:00:00.000,    2006-01-03 00:00:00.000
2006-01-03 00:00:00.000,    2006-01-04 00:00:00.000
2006-01-04 00:00:00.000,    2006-01-05 00:00:00.000
2006-01-05 00:00:00.000,    2006-01-05 08:00:00.000

Para a faixa anual de '2006-01-01 11:10:00' para '2009-05-05 08:00:00', eu esperaria.

select * 
from dbo.fnGetDateRanges('y', '2006-01-01 11:10:00', '2009-05-05 08:00:00') 

2006-01-01 11:10:00.000,    2007-01-01 00:00:00.000
2007-01-01 00:00:00.000,    2008-01-01 00:00:00.000
2008-01-01 00:00:00.000,    2009-01-01 00:00:00.000
2009-01-01 00:00:00.000,    2009-05-05 08:00:00.000

Como eu implementaria essa função?

questionAnswers(4)

yourAnswerToTheQuestion