Используйте таблицу подсчета очков ... она будет намного быстрее. Проверьте его на 10K дней ... и запустите код цикла в течение 10K дней.
declare @dateparameter date = '1900-04-12'
declare @numOfDays int = 10000
;WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select
datevalue = @dateparameter
,year = datepart(year,@dateparameter)
,quarter = datepart(quarter,@dateparameter)
,month = datepart(month,@dateparameter)
,dayofweek = datepart(weekday,@dateparameter)
union all
select
datevalue = dateadd(day,N,@dateparameter)
,year = datepart(year,dateadd(day,N,@dateparameter))
,quarter = datepart(quarter,dateadd(day,N,@dateparameter))
,month = datepart(month,dateadd(day,N,@dateparameter))
,dayofweek = datepart(weekday,dateadd(day,N,@dateparameter))
from cteTally
where N <= @numOfDays
Но, если вы собираетесь часто ссылаться на него, почему бы не сделать упорную таблицу? Аарон Бертран имеет отличную статью об этом: https://www.mssqltips.com/sqlservertip/4054/creating-a-date-dimension-or-calendar-table-in-sql-server/