Oggi condivido con voi una funzione che ho sviluppato diverso tempo fa ma che è sempre utile.

Questa funzione permette di controllare se una data corrisponde ad un giorno lavorativo “canonico” per l’italia:

CREATE FUNCTION [dbo].[ufn_IsWorkingDay]
(    
        @Date SMALLDATETIME =GETDATE
)

RETURNS bit 

AS
BEGIN

DECLARE @Result BIT
DECLARE @Year char(4)
SET @Year=YEAR(@Date)

DECLARE @calendar TABLE(the_date SMALLDATETIME, is_weekend BIT, is_holiday BIT)
DECLARE @holiday TABLE(the_date VARCHAR(10))


--FESTIVITA' FISSE
INSERT INTO @holiday( the_date )VALUES( @Year + '-01-01') --Capodanno  
INSERT INTO @holiday( the_date )VALUES( @Year + '-01-06') --Epifania 
INSERT INTO @holiday( the_date )VALUES( @Year + '-04-25') --Liberazione   
INSERT INTO @holiday( the_date )VALUES( @Year + '-05-01') --Festa del Lavoro 
INSERT INTO @holiday( the_date )VALUES( @Year + '-06-02') --Festa della Repubblica
INSERT INTO @holiday( the_date )VALUES( @Year + '-08-15') --Ferragosto
INSERT INTO @holiday( the_date )VALUES( @Year + '-11-01') --Tutti i Santi   
INSERT INTO @holiday( the_date )VALUES( @Year + '-12-08') --Immacolata Concezione      
INSERT INTO @holiday( the_date )VALUES( @Year + '-12-25') --Natale  
INSERT INTO @holiday( the_date )VALUES( @Year + '-12-26') --Santo Stefano     


-- PASQUA
declare
@c int
, @n int
, @k int
, @i int
, @j int
, @l int
, @m int
, @d int
, @Pasquetta datetime

set @c = (@Year / 100)
set @n = @Year - 19 * (@Year / 19)
set @k = (@c - 17) / 25
set @i = @c - @c / 4 - ( @c - @k) / 3 + 19 * @n + 15
set @i = @i - 30 * ( @i / 30 )
set @i = @i - (@i / 28) * (1 - (@i / 28) * (29 / (@i + 1)) * ((21 - @n) / 11))
set @j = @Year + @Year / 4 + @i + 2 - @c + @c / 4
set @j = @j - 7 * (@j / 7)
set @l = @i - @j
set @m = 3 + (@l + 40) / 44
set @d = @l + 28 - 31 * ( @m / 4 )

set @Pasquetta = DATEADD(DAY,1, CAST( convert(char(4),@Year) + '-' + right('0' + convert(varchar(2),@m),2) + '-' +  right('0' + convert(varchar(2),@d),2) AS DATETIME))

INSERT INTO @holiday( the_date )VALUES( CONVERT(VARCHAR(10), @Pasquetta,120)) --LUNEDI PASQUETTA

DECLARE @Counter tinyInt
SELECT @Counter= count(*) from @holiday WHERE the_date=CONVERT(VARCHAR(10), @Date,120)


    IF DATEPART(dw, @Date ) NOT IN (1,7) 
        AND (NOT EXISTS (SELECT  the_date FROM @holiday WHERE the_date=CONVERT(VARCHAR(10), @Date,120)))
    BEGIN
        SET @result=1
    END
    ELSE
        SET @result=0


    RETURN @result
END

 

Happy Coding 😉

Altri Articoli

SQL Fiddle
views 297
Oggi con mia grande sorpresa ho scoperto un altro utilissimo strumento on –line: SQL FIDDLE, come l’ormai famoso JSFiddle, quasto strumento ti permet...
Database: Tabelle Regioni Province Comuni
views 139
Script Creazione Tabelle: Generate GEO Tables.sql (6,68 kb) Script Generazione Dati: dbo_GEO_Regioni.SQL (7,37 kb) dbo_GEO_Province.SQL (49,23 kb) dbo...
T-SQL: Recuperare le directory di default dei file...
views 121
Con questo semplice script è possibile recuperare le directory di default dei file di dati e log di Sql Server declare @SmoDefaultFile nvarch...
T-Sql: Formattare una data in base alla CultureUI
views 110
Questa semplice funzione T-sql permette di formattare la data a seconda della CultureUI desiderata:Category: T-SQL