Per un progetto su cui sto lavorando ho bisogno di avere tutti i giorni di un dato mese passando come parametri l’anno e il mese.
Dopo aver preso spunto dall’idea di Itzik Ben-Gan dal suo libro “Inside SQL Server 2005 T-SQL Programming” sono arrivato a questa soluzione( è la bozza diciamo ).
set dateformat ymd
declare @year int,@month int
set @year = 2009
set @month = 6
;with
L0 as (select 1 as c union all select 1 ),
L1 as (select 1 as c from L0 as A,L0 as B),
L2 as (select 1 as c from L1 as A,L1 as B),
L3 as (select 1 as c from L2 as A,L2 as B),
L4 as (select 1 as c from L3 as A,L3 as B),
L5 as (select 1 as c from L4 as A,L4 B),
Nums as (select row_number() over(order by c) as n from L5)
select CAST( CAST(@year as nvarchar(4)) + N'-' +
CAST(@month as nvarchar(2)) +N'-' +
CAST( n as nvarchar(2)) as datetime) as dt
from Nums where n <= 31 and
ISDATE(CAST(@year as nvarchar(4)) + N'-' +
CAST(@month as nvarchar(2)) +N'-' +
CAST( n as nvarchar(2))) = 1
Questa query ritorna il set di date del mese di giugno dell’anno 2009.
Lo script fa uso delle CTE, funzioni di Ranking e funzioni sulle date. Funziona con le versioni di SQL Server che supportano queste features, io la sto usando su SQL Server 2005.