I believe the following function is faster than all the above suggested:
CREATE FUNCTION dbo.fnSeqDates
(
@LowDate DATETIME,
@HighDate DATETIME
)
RETURNS @Dates TABLE
(
SeqDate DATETIME
)
AS
BEGIN
DECLARE @Temp DATETIME
DECLARE @NumberOfDays int
IF @LowDate > @HighDate
SELECT @Temp = @LowDate,
@LowDate = DATEADD(day, DATEDIFF(day, 0, @HighDate) - 1, 0),
@HighDate = DATEADD(day, DATEDIFF(day, 0, @Temp), 0)
ELSE
SELECT @LowDate = DATEADD(day, DATEDIFF(day, 0, @LowDate) - 1, 0),
@HighDate = DATEADD(day, DATEDIFF(day, 0, @HighDate), 0)
SELECT @NumberOfDays = DATEDIFF(d, @LowDate, @HighDate)
INSERT @Dates
SELECT DATEADD(d, Number, @LowDate) AS Date FROM Numbers WHERE Number <= @NumberOfDays
RETURN
END
GO
It uses a Numbers table, containing all Numbers less than, say 1000000. This can be created once and for all as follows:
SELECT TOP 1000000 Number = IDENTITY(INT, 1, 1) INTO Numbers
FROM
sysobjects a1
CROSS JOIN
sysobjects a2
CROSS JOIN
sysobjects a3
CROSS JOIN
sysobjects a4
CROSS JOIN
sysobjects a5
ALTER TABLE Numbers
ADD CONSTRAINT Index_Numbers PRIMARY KEY CLUSTERED(Number)
GO