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: