Я не знаю, что вы на самом деле пытаетесь сделать здесь.Печать календарного месяца с помощью T-SQL, вероятно, не то, что вы хотите делать.
Вот запрос, который выдает все даты в текущем месяце в виде набора результатов.Если вы просто хотите получить номер дня месяца (как вы это сделали), вы можете использовать datepart(d, [Date])
, чтобы получить его.
;with cteLim as
(
select
dateadd(m, datediff(m, 0, getdate()), 0) as FirstDay,
dateadd(m, datediff(m, 0, getdate())+1, 0)-1 as LastDay
),
cteDays as
(
select FirstDay as [Date]
from cteLim
union all
select cteDays.[Date] + 1 as [Date]
from cteDays
inner join cteLim
on cteDays.[Date] < cteLim.LastDay
)
select [Date]
from cteDays
Та же функция, но результат деления на "calender"
;with cteLim as
(
select
dateadd(m, datediff(m, 0, getdate()), 0) as FirstDay,
dateadd(m, datediff(m, 0, getdate())+1, 0)-1 as LastDay
),
cteDays as
(
select FirstDay as [Date]
from cteLim
union all
select cteDays.[Date] + 1 as [Date]
from cteDays
inner join cteLim
on cteDays.[Date] < cteLim.LastDay
)
select
datepart(iso_week, [Date]) as [Week],
(select datepart(d, D2.[Date])
from cteDays as D2
where
datepart(iso_week, D2.[Date]) = datepart(iso_week, D1.[Date]) and
datepart(dw, D2.[Date]) = 2) as Mon,
(select datepart(d, D2.[Date])
from cteDays as D2
where
datepart(iso_week, D2.[Date]) = datepart(iso_week, D1.[Date]) and
datepart(dw, D2.[Date]) = 3) as Tue,
(select datepart(d, D2.[Date])
from cteDays as D2
where
datepart(iso_week, D2.[Date]) = datepart(iso_week, D1.[Date]) and
datepart(dw, D2.[Date]) = 4) as Wed,
(select datepart(d, D2.[Date])
from cteDays as D2
where
datepart(iso_week, D2.[Date]) = datepart(iso_week, D1.[Date]) and
datepart(dw, D2.[Date]) = 5) as Thu,
(select datepart(d, D2.[Date])
from cteDays as D2
where
datepart(iso_week, D2.[Date]) = datepart(iso_week, D1.[Date]) and
datepart(dw, D2.[Date]) = 6) as Fri,
(select datepart(d, D2.[Date])
from cteDays as D2
where
datepart(iso_week, D2.[Date]) = datepart(iso_week, D1.[Date]) and
datepart(dw, D2.[Date]) = 7) as Sat,
(select datepart(d, D2.[Date])
from cteDays as D2
where
datepart(iso_week, D2.[Date]) = datepart(iso_week, D1.[Date]) and
datepart(dw, D2.[Date]) = 1) as Sun
from cteDays as D1
group by datepart(iso_week, [Date])
Результат
Week Mon Tue Wed Thu Fri Sat Sun
----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
9 NULL 1 2 3 4 5 6
10 7 8 9 10 11 12 13
11 14 15 16 17 18 19 20
12 21 22 23 24 25 26 27
13 28 29 30 31 NULL NULL NULL