Post by Lorenzo Benaglia"No Table? No Problem"
http://www.windowsitpro.com/Article/ArticleID/27051/27051.html
Molto interessante l'artico di Itzik Ben-Gan, la richiesta di davide è
però più insidiosa, non basta sapere quanti sabati e domeniche esistono
tra due date ma bisogna stimare una dateadd che non consideri i festivi
dove con "festivi" si intendono anche le festività nazionali e i periodi
di chiusura dell'azienda.
Posto una soluzione basata su una tabella d'appoggio che trovo
soddisfaciente e che è decisamente più performante della precedente
soluzione che ho proposto:
use tempdb
go
create table t_Festività(Data datetime not null primary key,
Anno as year(Data),Mese as month(Data),Giorno as Day(Data),
constraint vu unique (Anno,Mese,Giorno))
go
insert into t_Festività values('20050425')
insert into t_Festività values('20050501')
insert into t_Festività values('20050602')
go
create function f_DateAddFeriali(@Data datetime,@Days int)
returns datetime
as
begin
Declare @d Datetime,@c int
select @d=case when @Days>0 then @Data+@Days else @Data end,
@Data=case when @Days>0 then @Data else @Data-@Days end
select @c=count(*) from t_Festività
where Data between @Data+1 and @d
if @c=0 return @d
return dbo.f_DateAddFeriali(@d,@c)
end
go
select dbo.f_DateAddFeriali('20050420',11)
select dbo.f_DateAddFeriali('20050503',-11)
go
drop function f_DateAddFeriali
drop table t_Festività
P.S.
Il problema è veramente molto affascinante.. peccato non averci pensato
per un "divertimento con..."
:-D marc.