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.