Calcular dias úteis com Power Query pode parecer um bicho de sete cabeças, mas eu garanto que é mais fácil do que você pensa. Já se perdeu contando dias úteis no calendário e se sentiu como se estivesse em um labirinto? Fica tranquilo!
O Power Query está aqui para ser o seu GPS nessa jornada. Vamos começar do zero e subir de nível até você se tornar um mestre que até leva em conta os feriados!
Começando Simples: O Básico Sem Feriados
Segura essa, FERA! Vamos começar com o básico, sem complicação.
Vou te mostrar a seguir um comando que você pode colocar ai no seu Excel ou Power BI hoje mesmo.
Em seu editor Power Query, crie uma nova consulta em branco, e cole esse comando a seguir:
(
dataInicio as date,
dataFim as date
) =>
let
listaDatas = List.Dates(dataInicio, Duration.Days(dataFim - dataInicio)+1, #duration(1,0,0,0)),
listaDiasUteis = List.Select(listaDatas, each Date.DayOfWeek(_, Day.Monday) < 5)
in
List.Count(listaDiasUteis) - 1
Com a função criada, basta você dar um nome para ela, e eu recomendo sempre preceder com “fx”, como eu fiz aqui:
Agora que você tem uma função, basta invocar com uma coluna personalizada.
No exemplo abaixo, eu tenho algumas datas, e te mostro como fazer:
E na caixinha de fórmula digite assim:
Prontinho 👇👇
Me permita agora te explicar detalhadamente como funciona cada parte da função personalizada que fizemos juntos:
- List.Dates: Essa função cria uma lista de datas começando pela
dataInicio
até adataFim
. Ela usa#duration(1,0,0,0)
para indicar que queremos avançar um dia de cada vez. - Duration.Days: Essa função calcula a diferença em dias entre
dataInicio
edataFim
. É uma forma elegante de calcular a diferença entre duas datas, sem “enjambrar” nada 😂 - List.Select: Essa é a função que faz a mágica acontecer. Ela pega a lista de datas e filtra só os dias úteis. É como pegar um saco de balas e tirar só as que você gosta.
- Date.DayOfWeek: Essa função pega uma data e retorna a posição (ordem) do dia na semana.
- Day.Monday: Aqui é onde você define qual é o primeiro dia da semana. No caso, estamos usando segunda-feira (Monday) como o primeiro dia. É como se você estivesse dizendo: “A semana começa na segunda, então me dá só os dias úteis baseados nisso.”
O Poder das Listas: Nível HARD
Prepare-se, FERA! Agora é hora de subir o nível e falar sobre o poder das listas no Power Query.
As listas são como uma caixa de ferramentas completa, com tudo que você precisa para qualquer situação.
🏖️ Feriados são como aqueles episódios especiais de série que você não pode perder.
Então, vamos incluí-los na nossa função:
(
dataInicio as date,
dataFim as date,
optional listaFeriados
) =>
let
feriados = if listaFeriados = null then {} else listaFeriados,
listaDatas = List.Dates(
dataInicio,
Duration.Days(dataFim - dataInicio) + 1,
#duration(1, 0, 0, 0)
),
listaDiasUteis = List.Select(listaDatas, each Date.DayOfWeek(_, Day.Monday) < 5),
listaDiasUteisSemFeriados = List.Difference(listaDiasUteis, feriados)
in
List.Count(listaDiasUteisSemFeriados) - 1
Pra informar esses feriados, você deve criar uma lista com eles, que pode ser assim:
// 5 feriados de exemplo
let
feriados = {
#date(2000,1,1),
#date(2000,9,7),
#date(2000,11,2),
#date(2000,11,15),
#date(2000,12,31)
}
in
feriados
Ou, pode ter uma tabela que está no Power Query, e precisa converter em lista
Com essa lista em mãos, basta incluir no parâmetro da função invocada
E como funciona esse tratamento dos feriados?
- List.Difference: Essa função é o verdadeiro herói aqui. Ela pega a lista de dias úteis e remove os feriados. É como ter um filtro de água que tira todas as impurezas e deixa só o que é bom.
- if listaFeriados = null then {} else listaFeriados: Aqui estamos usando uma condicional para verificar se a lista de feriados foi fornecida. Se não foi, a gente assume uma lista vazia. É como dizer: “Se você não me disser quais são os feriados, vou assumir que não tem nenhum!”
- List.Count: Por fim, essa função conta quantos dias úteis sobraram depois de remover os feriados. É o grand finale!
NIVEL HARD 2 – Feriado do dia e mês (em “passar” o ano)
Similar ao anterior, nesse caso precisamos de uma lista de “MES & DIA” dos feriados.
Neste exemplo vou colocar os “mês & dia” dos feriados direto dentro da função, evitando assim necessidade do terceiro argumento opcional.
(
dataInicio as date,
dataFim as date
) =>
let
feriadosMesDia = {
"0101", // janeiro - dia 1
"0907", // setembro - dia 7
"1102", // novembro - dia 2
"1115", // novembro - dia 15
"1225" // dezembro - dia 25
},
listaDatas = List.Dates(
dataInicio,
Duration.Days(dataFim - dataInicio) + 1,
#duration(1, 0, 0, 0)
),
listaDiasUteis = List.Select(listaDatas, each Date.DayOfWeek(_, Day.Monday) < 5),
listaDiasUteisSemFeriados =
List.Select(
listaDiasUteis,
each List.Contains(feriadosMesDia, Date.ToText(_, "MMdd")) = false
)
in
List.Count(listaDiasUteisSemFeriados) - 1
Veja só como funciona cada uma das implementações
- Date.ToText: Essa função transforma a data em uma string no formato “MMdd”. É como se você pegasse uma foto sua e a transformasse em um desenho!
- List.Contains: Essa função verifica se um determinado “MMdd” está na lista de feriados. É o nosso segurança na porta da balada, conferindo se você está na lista VIP ou não.
- List.Select com List.Contains: Aqui, estamos usando
List.Select
novamente, mas desta vez comList.Contains
para filtrar os dias úteis que também são feriados. É como ter um filtro duplo no café: só passa o que é realmente bom!
Aprendendo com o Vídeo
Se você é mais do tipo visual e prefere aprender vendo, tenho uma novidade: temos um vídeo explicando tudo isso no meu canal do YouTube!
É uma ótima forma de aprender essa técnica passo a passo e ainda pegar algumas dicas extras.
Então, não perca tempo e clique aqui para assistir.
Nesse vídeo eu usei uma outra técnica, diferente da apresentada neste artigo, e é interessante que você conheça
E se você é dos mais AVANÇADOS, que gosta de conteúdo denso, então tem uma LIVE (que está aberta), que falo sobre esse assunto, no canal de meu amigo CRISTIANO GALVÃO.
Clique Aqui para assistir, e aprenda como o List.Buffer pode turbinar ainda mais essa técnica.
ATENÇÃO: E quando a data final é anterior que a inicial…
Nossa amiga Érika postou nesse vídeo do Youtube dúvida interessante, envolvendo um cálculo de dias “negativos”. veja só:
Acontece que quando usamos o List.Dates
no Power Query, ele PRECISA que a data inicial seja menor que a final.
Mas, é possível fazer um pequeno ajuste na função, de modo que ela entregue o resultado negativo, quando a situação for inversa, como proposto pela Erilka.
(
dataInicio as date,
dataFim as date
) =>
let
x = List.Min({dataInicio, dataFim}), // etapa ACRESCENTADA
y = List.Max({dataInicio, dataFim}), // etapa ACRESCENTADA
pn = if dataInicio < dataFim then 1 else -1, // etapa acrescentada
listaDatas = List.Dates(Date.AddDays(x,1), Duration.Days(y - x) , #duration(1,0,0,0)), // etapa MODIFICADA
listaDiasUteis = List.Select(listaDatas, each Date.DayOfWeek(_, Day.Monday) < 5)
in
List.Count(listaDiasUteis) * pn // etapa MODIFICADA
Nesse exemplo, estamos fazendo uma avaliação das variáveis x
e y
para usá-las como parâmetros de nossa função.
O cálculo parte do dia 0
, logo, quando o intervalo é negativo, temos que fazer esse ajuste extra, mas é mais fácil entender em uma imagem:
Agora ficou fácil ein…
Conclusão
E aí, virou ou não virou um mestre em calcular dias úteis com Power Query? Agora você tem o poder de ir do básico ao avançado, tudo na palma da sua mão. Quer mais? Então, não perca tempo e conheça nossa FORMAÇÃO POWER QUERY 2.0, que vai MUITO ALÉM DO POWER QUERY.
E aí, curtiu?
Então não perca mais tempo e mergulhe de cabeça na nossa FORMAÇÃO 🚀
Te vejo do outro lado!