Semplice funzione SQL per il calcolo dei giorni lavorativi tra due date. La funzione è ottimizzata per evitare il conteggio dei giorni all’interno di un loop. Questa funzione non tiene conto della festività della pasquetta e del santo patrono ma potrà essere facilmente integrata utilizzando la funzione di calcolo del giorno di Pasqua presente in questo sito.
CREATE FUNCTION GiorniLavorativi
(@DataIni DATE,
@DataFine DATE)
RETURNS INT
AS
BEGIN
DECLARE @SaltaGiornoInizio int
DECLARE @SettimaneIntere int
DECLARE @DataFineArrotondata DATETIME
DECLARE @GiorniFinali int
DECLARE @GiorniTot int
SET @SettimaneIntere = DateDiff(d, @DataIni, @DataFine)/7
SET @DataFineArrotondata = DATEADD(WW, @SettimaneIntere, @DataIni)
SET @GiorniFinali = 0
WHILE @DataFineArrotondata <= @DataFine
BEGIN
If DATEPART(dw, @DataFineArrotondata) <> 7 AND --sab
DATEPART(dw, @DataFineArrotondata) <> 1 --dom
SET @GiorniFinali = @GiorniFinali + 1
SET @DataFineArrotondata = DATEADD(d, 1, @DataFineArrotondata)
END
SET @GiorniTot = @SettimaneIntere * 5 + @GiorniFinali
DECLARE @AnnoInizio int
DECLARE @a int
DECLARE @AnnoFine int
SET @AnnoInizio = Year(@DataIni)
SET @a = @AnnoInizio
SET @AnnoFine = Year(@DataFine)
DECLARE @festa DATETIME
DECLARE @pasquetta DATETIME
DECLARE @x int
WHILE @a <= @AnnoFine
BEGIN
SET @x = 0
WHILE @x <= 9
BEGIN
SET @festa= CONVERT(DATETIME,
(case @x
WHEN 0 THEN CONVERT(CHAR(4),@a)+'-01-01' -- Capodanno
WHEN 1 THEN CONVERT(CHAR(4),@a)+'-01-06' -- Epifania
WHEN 2 THEN CONVERT(CHAR(4),@a)+'-04-25' -- Liberazione
WHEN 3 THEN CONVERT(CHAR(4),@a)+'-05-01' -- Lavoro
WHEN 4 THEN CONVERT(CHAR(4),@a)+'-06-02' -- Repubblica
WHEN 5 THEN CONVERT(CHAR(4),@a)+'-08-15' -- Ferragosto
WHEN 6 THEN CONVERT(CHAR(4),@a)+'-11-01' -- Ognissanti
WHEN 7 THEN CONVERT(CHAR(4),@a)+'-12-08' -- Ascensione
WHEN 8 THEN CONVERT(CHAR(4),@a)+'-12-25' -- Natale
WHEN 9 THEN CONVERT(CHAR(4),@a)+'-12-26' -- Santo Stefano
END),120)
IF @festa >= @DataIni AND @festa <= @DataFine AND
DATEPART(dw, @festa) <> 7 AND --sab
DATEPART(dw, @festa) <> 1 --dom
BEGIN
SET @GiorniTot = @GiorniTot - 1
END
SET @x=@x+1
END
SET @a=@a+1
END
DECLARE @GiorniLavorativi int
SET @GiorniLavorativi = @GiorniTot
RETURN @GiorniLavorativi
END