Publicidade

Como cálcular a quantidade de dias úteis em um período

Olá pessoal.

Estava aqui trabalhando e me deparei com uma situação muito comum e que é bem complicada: trabalhar com intervalos de data e ainda mais difícil quando nesse intervalo nós queremos calcular quantos dias úteis há nele!

Quando digo dias úteis, me refiro aos dias de segunda a sexta, excluindo sábados e domingos. Claro, os fériados não entram nessa matemática, porque eles variam muito, de região para região, de país para país e muitas outras variações.

Sendo assim, vou mostrar duas formas de calcular os dias úteis em um intervalo de tempo, a primeira é considerando dias úteis de segunda a sexta e a outra considerando junto o desconto de feríados.

Vamos ao primeiro métodos, onde em ambos não é necessário criar funções, stored procedures e nem nada, este código pode ser inserido direto no “select” ou “where”, segue o código:

declare @startDate as date,
    @endDate as date

set @startDate = convert(datetime, '01-01-2017', 120)
set @endDate = convert(datetime, getdate(), 120)

(select (datediff(dd, @startDate, @endDate)) -
        (datediff(wk, @startDate, @endDate) * 2) - 
        (case when datename(dw, @startDate) = 'Sunday' then 1 else 0 end) - 
        (case when datename(dw, @endDate) = 'Saturday' then 1 else 0 end))

 Vamos a explicação, esse “select” pega a data final definida por “@endDate” e subtrai da data inicial definida por “@startDate”, validando os “sábados (Saturday)” e “domingos (Sunday)”, assim ele subtrai a data final da data inicial e desconta 1 dia para cada sábado e cada domingo que houver entre as datas, neste caso temos 132 dias desde o dia 01/01/2017 até hoje 12/05/2017, com 95 dias úteis contando hoje, ou seja, (dias no intervalo = 132) – (sábados e domingos = 37) = (dias úteis = 95).

Agora vamos ao segundo método que calcula os dias úteis no período considerando os feriados, mas como? Eu tenho aqui uma tabela de feriados, muito simples, é uma tabela chamada “Feriados” com somente 1 coluna do tipo “datetime” chamada, “Data”, e nela eu gravo todos os feriados do ano, ano após ano, com essa tabela eu faço um diferencias com o comando acima e tenho a quantidade de dias úteis no período descontando sábados, domingos e feriados, vejam:

declare @startDate as date,
        @endDate as date

set @startDate = convert(datetime, '01-01-2017', 120)
set @endDate = convert(datetime, getdate(), 120)

select ((select (datediff(dd, @startDate, @endDate)) -
                (datediff(wk, @startDate, @endDate) * 2) - 
                (case when datename(dw, @startDate) = 'Sunday' then 1 else 0 end) - 
                (case when datename(dw, @endDate) = 'Saturday' then 1 else 0 end)) -
        (select count(*)
         from Feriados FE
         where convert(datetime,FE.Data,120) between @startDate and @endDate))

Explicação, reparem que usei o mesmo trecho de código do exemplo 1 encapsulado entre “( )” e subtrai do “count” da tabela de “Feriados” também encapsulado entre “( )”, assim eu tenho os 95 dias retornado do calculo de dias úteis no período descontando sábados e domingos, menos os dias cadastrados na tabela de “Feriados”, dessa forma os 95 dias úteis do ano se tornam 88 aqui para a minha região que é Porto Alegre, Rio Grande do Sul Brasil, que desde 01/01/2017 até 12/05/2017 houverão 7 feriados (01/01, 02/02, 27/02, 28/02, 14/04, 21/04 e 01/05).

Espero que ajude vocês pessoal, dúvidas, só postar nos comentários.

Abraço.

Deixe um comentário

O seu endereço de e-mail não será publicado.