Função Dias úteis - SQL SERVER
- Amanda Nascimento
- 23 de nov. de 2023
- 1 min de leitura
Atualizado: 23 de set. de 2024
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:
