• 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