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