Вы можете использовать таблицу подсчета внутри встроенной функции табличного значения.
CREATE TABLE Numbers (N INT PRIMARY KEY NOT NULL);
INSERT INTO Numbers
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) -1 N
FROM
(
VALUES (NULL), (NULL), (NULL), (NULL), (NULL)
) T1(V) CROSS JOIN
(
VALUES (NULL), (NULL), (NULL), (NULL), (NULL)
) T2(VV) CROSS JOIN
(
VALUES (NULL), (NULL), (NULL), (NULL), (NULL) --Add Values as needed
) T3(VVV);
Затем создайте свою функцию как
CREATE FUNCTION dbo.MyFunc
(
@FromDate DATE,
@ToDate DATE,
@DataInterval INT,
@RangeInterval INT
)
RETURNS TABLE
RETURN
SELECT DATEADD(Day, (@DataInterval * N) - @RangeInterval, @FromDate) FromDate,
DATEADD(Day, @DataInterval * N, @FromDate) ToDate
FROM Numbers
WHERE DATEADD(Day, @DataInterval * N, @FromDate) <= @ToDate;
И, наконец, используйте ее как
SELECT *
FROM dbo.MyFunc ('20180701', '20180901', 5, 30);
Демонстрация в Интернете