Article image
Daniel BINS
Daniel BINS27/06/2024 10:11
Share

Como calcular dias úteis com Power BI

    Neste artigo vamos ver como calcular os dias úteis entre duas datas no Power BI utilizando DAX.

    Você vai utilizar neste artigo as seguintes funções DAX:

    • DATATABLE()
    • SELECTCOLUMNS()
    • WEEKDAY()
    • WEEKNUM()
    • TODAY()
    • DATEDIFF()
    • NETWORKDAYS()

    Criando uma tabela

    Primeiro vamos criar uma tabela que vai servir como exemplo. Vamos criar uma tabela para guardar os nomes de clientes e sua respectiva data de cadastro.

    Ao abrir o Power BI, clique na guia "Modelagem" e depois clique no botão "Nova tabela".

    image

    Deverá aparecer na parte superior da tela um campo onde você vai escrever sua expressão DAX. Vai aparecer "Tabela = " e o cursor vai estar no final, aguardando você digitar a sua expressão. 

    image

    Você irá substituir tudo pela seguinte expressão, e no final pressionar ENTER.

    Clientes =
    DATATABLE(
    "Nome", STRING,
    "Email", STRING,
    "DataCadastro", DATETIME,
    {
    {'João', 'joao@teste.com.br','2024-01-01'},
    {'Lucas', 'lucas@teste.com.br','2024-01-17'},
    {'Matheus', 'matheus@teste.com.br','2024-02-12'},
    {'Thiago', 'thiago@teste2.com.br','2024-02-20'},
    {'Madalena', 'madalena@teste.com.br','2024-03-02'},
    {'Pedro', 'pedro@teste.com.br','2024-03-11'},
    {'David', 'david@teste2.com.br','2024-03-29'},
    {'Salomão', 'salomao@teste.com.br','2024-03-30'},
    {'Zedebeu', 'zebedeu@teste.com.br','2024-04-06'},
    {'Josue', 'josue@teste2.com.br','2024-06-05'}
    }
    )
    

    image

    Sua tabela deve aparecer na aba "Dados", localizada no lado direito da tela.

    image

    O comando DATATABLE recebe uma lista de campos (nome e tipo de dados), e na sequência uma lista de registros, que devem ser inseridos na mesma ordem em que os campos foram criados.

    Os tipos de dados utilizados no DAX são os seguintes: Integer, Double, String, Boolean, Currency e DateTime.

    O tipo de dados String se refere a textos, Integer, Double e Currency se referem a números, Boolean é do tipo verdadeiro/false e Datetime armazena datas e horas.

    Para ver os dados da tabela que você criou, basta clicar no botão "Modo de exibição de tabela", localizado no lado esquerdo da tela

    image

    Exemplos de manipulação de datas

    Com esta tabela criada, vamos explorar alguns recursos do DAX. Com base na data de cadastro, vamos retornar o dia da semana, o número da semana e a quantidade de dias entre a data de cadastro e a data atual.

    Para isso, vamos criar uma nova tabela com base nesta tabela de clientes. Repita o processo anterior que você executou para criar a tabela de clientes, ou seja, clique no botão "Nova tabela" da aba "Modelagem"

    ClientesDatas = 
    SELECTCOLUMNS(
    'Clientes',
    "Nome",[Nome],
    "Email", [Email],
    "DataCadastro", [DataCadastro], 
    "DiaCadastro", WEEKDAY([DataCadastro]),
    "SemanaCadastro", WEEKNUM([DataCadastro]),
    "DiasCadastrado", DATEDIFF([DataCadastro],TODAY(),DAY)
    )
    

    image

    A função SELECTCOLUMNS retorna como resultado uma tabela. Ele recebe como primeiro parâmetro o nome da tabela, e como parâmetros seguintes as colunas que desejamos retornar. Primeiro informamos qual o alias (apelido) desejado e na sequência informamos o nome da coluna entre chaves. Podemos usar SELECTCOLUMNS para criar novas colunas, como foi o caso das colunas "DiaCadastro", "SemanaCadastro" e "DiasCadastrado", que não existiam em nossa tabela de Clientes.

    A função WEEKDAY retorna um número inteiro que representa o dia da semana da data informada. Por padrão, o dia pode variar entre 1 (domingo) e 7 (sábado). Já a função WEEKNUM retorna um número que representa o número da semana no ano atual. 

    E por último a função DATEDIFF permite retornar a quantidade de dias entre a data inicial, que é a data de cadastro, e a data final, representada pelo retorno da função TODAY. O terceiro parâmetro informa que o número inteiro retornado pelo DATEDIFF se refere a dias.

    Criando uma tabela de feriados

    Nosso objetivo é calcular os dias úteis entre duas datas. Para isso, precisamos calcular a diferença de dias entre duas datas e remover os finais de semana e os feriados.

    Para implementar nossa solução, vamos precisar criar uma tabela contendo os feriados. Repita os passos que fizemos para criar a tabela Clientes e insira os seguintes dados:

    Feriados = 
    DATATABLE(
    "Data", DATETIME,
    {
    {'2024-01-01'},
    {'2024-03-29'},
    {'2024-04-21'},
    {'2024-05-01'},
    {'2024-09-07'},
    {'2024-10-12'},
    {'2024-11-02'},
    {'2024-11-15'},
    {'2024-12-25'}
    }
    )
    

    image

    Com a tabela de Feriados criada, chegou a hora de calcular a diferença de dias úteis entre a data atual e a data de cadastro. Para isso, vamos utilizar a função NETWORKDAYS

    Calculando dias úteis com a função NETWORKDAYS

    A função NETWORKDAYS recebe quatro argumentos, que são:

    1 - A data inicial

    2 - A data final

    3 - Um código representando os dias da semana que devem ser ignorados.

    4 - Uma tabela contendo datas que devem ser ignoradas.

    Em nosso exemplo, a data inicial é o campo DataCadastro da tabela Clientes. A data final é a data de hoje, ela pode ser obtida utilizando a função TODAY(). 

    Os códigos que podem ser utilizados para ignorar certos dias da semana é o seguinte:

    1 ou nada - Sábado e Domingo

    2 - Domingo e Segunda

    3 - Segunda e Terça

    4 - Terça e Quarta

    5 - Quarta e Quinta

    6 - Quinta e Sexta

    7 - Sexta e sábado

    11 - Somente Domingo

    12 - Somente Segunda

    13 - Somente Terça

    14 - Somente Quarta

    15 - Somente Quinta

    16 - Somente Sexta

    17 - Somente Sábado

    Por último, a tabela que contém as datas que devemos ignorar na contagem de dias úteis é a tabela Feriados, que foi criada por último.

    Chegou a hora de implementar a nossa fórmula para calcular dias úteis. Vamos criar uma nova tabela com base em nossa tabela de Clientes e adicionar colunas para calcular a diferença de dias considerando a diferença de dias normal e a diferença de dias apenas considerando os dias úteis:

    ClientesDiasUteis = 
    SELECTCOLUMNS(
    'Clientes',
    "Nome",[Nome],
    "Email", [Email],
    "DataCadastro", [DataCadastro],
    "DiasCadastrado", DATEDIFF ([DataCadastro],TODAY(),DAY),
    "DiasUteisCadastrado", NETWORKDAYS([DataCadastro],TODAY(), 1, Feriados) 
    ) 
    

    image

    Nossa implementação ficou da seguinte forma:

    NETWORKDAYS([DataCadastro],TODAY(), 1, Feriados) 
    

    Perceba que no terceiro parâmetro informamos o código 1, que informa a função NETWORKDAYS que ela deve ignorar sábados e domingos.

    Este é o nosso resultado final:

    image

    Referência

    https://dax.guide/networkdays/

    Share
    Comments (0)