top of page

Função Dias úteis - SQL SERVER

Atualizado: 23 de set.



Primeiramente antes de criar algo, precisamos identificar se esse algo, já existe.


Para saber o nome do schama que você esta utilizando:




SELECT SCHEMA_NAME();


Em sqlserver o nome será dbo, por isso coloquei na query abaixo 'dbo'

SELECT *

FROM sys.objects

WHERE type_desc = 'SQL_SCALAR_FUNCTION'

AND schema_name(schema_id) = 'dbo'




Ou, podemos fazer desta forma:

SELECT *

FROM sys.objects

WHERE type_desc = 'SQL_SCALAR_FUNCTION'

AND schema_id = SCHEMA_ID()






--------------------------------------------------------------------------------------------------------------

Com a função criada, é preciso identificar a tabela que esta o dado que iremos criar a query.


No meu caso, utilizei a tabela d_calendario que criei. Caso queira construir uma tabela de calendarios, link github



Criando a função:




CREATE FUNCTION fn_contagem_dias_uteis

(

@datainicial DATE,

@datafinal DATE

)

RETURNS INT

AS

BEGIN

DECLARE @dias_uteis INT = 0;


WHILE @datainicial <= @datafinal

BEGIN

-- Verifica se o dia da semana é sábado (6) ou domingo (0)

IF DATEPART(WEEKDAY, @datainicial) NOT IN (1, 7)

BEGIN

-- Verifica se é um dia não útil de acordo com a tabela de feriados

IF NOT EXISTS(SELECT 1 FROM feriados WHERE FeriadoData = @datainicial)

BEGIN

SET @dias_uteis += 1;

END

END;


SET @datainicial = DATEADD(DAY, 1, @datainicial);

END;


RETURN @dias_uteis;

END;




Criando a query com os dias úteis (sem considerar feriados nacionais ou regionais)



WITH diasuteis AS (

SELECT distinct

CONVERT(varchar, DATEADD(month, DATEDIFF(month, 0, data), 0), 103) AS datainicial,

CONVERT(varchar, EOMONTH(data), 103) AS datafinal

FROM

d_calendario

)

SELECT

datainicial,

datafinal,

dbo.fn_contagem_dias_uteis(datainicial, datafinal) AS dias_uteis

FROM

diasuteis



Resultado:














bottom of page