Olá a todos, nesse post rápido irei disponibilizar duas funções (uma utiliza a outra) para listar os feriados do ano. Para saber as datas dos feriados, é necessário calcular a páscoa, a partir dai é só adicionar o número de dias correspondente ao feriado.
Função para calcular a páscoa.
CREATE FUNCTION ObterDataPascoa(@ano INT) RETURNS SMALLDATETIME AS BEGIN DECLARE @seculo INT, @G INT, @K INT, @I INT, @H INT, @J INT, @L INT, @MesDePascoa INT, @DiaDePascoa INT, @pascoa SMALLDATETIME; SET @seculo = @ano / 100 SET @G = @ano % 19 SET @K = ( @seculo - 17 ) / 25 SET @I = ( @seculo - CAST(@seculo / 4 AS INT) - CAST(( @seculo - @K ) / 3 AS INT) + 19 * @G + 15 ) % 30 SET @H = @I - CAST(@I / 28 AS INT) * ( 1 * -CAST(@I / 28 AS INT) * CAST(29 / ( @I + 1 ) AS INT) ) * CAST(( ( 21 - @G ) / 11 ) AS INT) SET @J = ( @ano + CAST(@ano / 4 AS INT) + @H + 2 - @seculo + CAST(@seculo / 4 AS INT) ) % 7 SET @L = @H - @J SET @MesDePascoa = 3 + CAST(( @L + 40 ) / 44 AS INT) SET @DiaDePascoa = @L + 28 - 31 * CAST(( @MesDePascoa / 4 ) AS INT) SET @pascoa = CAST(@MesDePascoa AS VARCHAR(2)) + '-' + CAST(@DiaDePascoa AS VARCHAR(2)) + '-' + CAST(@ano AS VARCHAR(4)) RETURN @pascoa; END
Função para listar os feriados
CREATE FUNCTION ObterFeriados(@ano INT = NULL) RETURNS @feriado TABLE (dia DATE, feriado VARCHAR(100)) AS BEGIN DECLARE @pascoa SMALLDATETIME; DECLARE @dia INT; DECLARE @mes INT; DECLARE @anoPascoa INT; IF(@ano IS NULL) BEGIN SET @ano = DATEPART(YEAR, GETDATE()); END SET @pascoa = dbo.ObterDataPascoa(@ano); SET @dia = DATEPART(DAY, @pascoa); SET @mes = DATEPART(MONTH, @pascoa); SET @anoPascoa = DATEPART(YEAR, @pascoa); INSERT INTO @feriado (dia, feriado) VALUES(@pascoa, 'Pascoa'); INSERT INTO @feriado (dia, feriado) VALUES(CAST('1-1-' + CAST(@anoPascoa AS VARCHAR) AS DATE), 'Confraternização Universal'); INSERT INTO @feriado (dia, feriado) VALUES(CAST(CAST(@anoPascoa AS VARCHAR) + '-4-21' AS DATE), 'Tiradentes'); INSERT INTO @feriado (dia, feriado) VALUES(CAST(CAST(@anoPascoa AS VARCHAR) + '-5-1' AS DATE), 'Dia do Trabalhador'); INSERT INTO @feriado (dia, feriado) VALUES(CAST(CAST(@anoPascoa AS VARCHAR) + '-9-7' AS DATE), 'Dia da Independência'); INSERT INTO @feriado (dia, feriado) VALUES(CAST(CAST(@anoPascoa AS VARCHAR) + '-10-12' AS DATE), 'N. S. Aparecida'); INSERT INTO @feriado (dia, feriado) VALUES(CAST(CAST(@anoPascoa AS VARCHAR) + '-11-2' AS DATE), 'Todos os santos'); INSERT INTO @feriado (dia, feriado) VALUES(CAST(CAST(@anoPascoa AS VARCHAR) + '-11-15' AS DATE), 'Proclamação da republica'); INSERT INTO @feriado (dia, feriado) VALUES(CAST(CAST(@anoPascoa AS VARCHAR) + '-12-25' AS DATE), 'Natal'); INSERT INTO @feriado (dia, feriado) VALUES(DATEADD(DAY, 60, @pascoa), 'Corpus Christi'); INSERT INTO @feriado (dia, feriado) VALUES(DATEADD(DAY, -2, @pascoa), '6º feira Santa'); INSERT INTO @feriado (dia, feriado) VALUES(DATEADD(DAY, -47, @pascoa), '3º feria Carnaval'); INSERT INTO @feriado (dia, feriado) VALUES(DATEADD(DAY, -48, @pascoa), '2º feria Carnaval'); RETURN; END
Utilizando a função
SET LANGUAGE english SELECT dia, feriado FROM dbo.ObterFeriados(2013) ORDER BY dia;
Espero que tenham gostado
parabens… me ajudo muitto
Ótimo, seria ótimo usar campos DATE já que feriado não tem hora e só corrige a independência do Brasil que é 7 de setembro e não 9 de julho.
nao gostei
Muito bom, utilizo ele em um projeto organizado e recursivo! me ajudou muito!!!