Usando as Expressões DAX para determinar datas diversas, futuras e passadas.
- Hugo Venturini
- 5 de jun. de 2022
- 6 min de leitura
Atualizado: 12 de fev. de 2023
Sempre que falamos em cálculos de inteligência temporal, no contexto das Expressões DAX, seja no Power Pivot do Excel, seja no Power BI, uma das primeiras aplicações práticas que nos vêm em mente, é a utilização destas em cálculos mais complexos, envolvendo médias e acumulados, por exemplo, onde costumeiramente fazemos uso de outras funções, como a DATESBETWEEN ou a DATESINPERIOD, que requerem exatamente datas como parâmetros.
Deste modo, conseguir determinar estas datas, futuras ou passadas, de forma dinâmica, não somente nos dá maior liberdade para trabalhar, como também a tranquilidade de que a solução continuará funcionando adequadamente ao longo do tempo, sem a necessidade de manutenção ou retrabalho.
Assim, resolvi escrever este artigo, que servirá de base para um vídeo também, para deixar documentado o meu método, pois acredito que possa servir à necessidade de outros profissionais, como fonte de consulta.
Mãos à obra!
Veremos ao longo do artigo, explicações mais bem detalhadas de diversas funções, e a primeira delas, por mais básico que possa parecer, é a função TODAY (), que nos retorna, como o nome sugere, a data de hoje:
Hoje = TODAY ()
Resposta: 05/06/2022
Partindo deste ponto, podemos encontrar este mesmo dia (5) nos próximos meses, ou nos meses passados, utilizando a função EDATE ():

StartDate = Data inicial, que serve de ponto de partida para o cálculo que será executado.
Meses = número de meses que deve ser acrescido ou subtraído da Data Inicial, para se chegar ao resultado desejado.
Esta função, partindo de uma data inicial, que tanto pode ser informada manualmente, quanto pode ser informada dinamicamente através de outras expressões como a TODAY (), desloca esta mesma data, um determinado número de meses, para o futuro ou para o passado, que é informado em seu segundo parâmetro: número positivos para meses futuros, e números negativos para meses passados.
Mesmo Dia no Próximo Mês = EDATE (TODAY (), 1)
Resposta: 05/07/2022
No segundo parâmetro da função EDATE (), foi informado o número positivo “1”, o que acrescentou 1 mês à data inicial, informada dinamicamente no primeiro parâmetro, através da função TODAY ().
Deste modo, se hoje é igual a 05/06/2022, acrescido de um mês, temos 05/07/2022.
Assim, fica mais simples compreender que basta manipular o segundo argumento desta mesma expressão, para encontrar outras datas, como esta mesma, no mês anterior:
Mesmo Dia no Mês Anterior = EDATE (TODAY (), -1)
Resposta: 05/05/2022
Em vez de “1”, aqui foi informado “-1”, o que fez com que o resultado retrocedesse.
Limitaremos a experiência ao exposto, para que possamos prosseguir com outras expressões.
Outra função extremamente útil e interessante do conjunto de funções de Inteligência Temporal é a função EOMONTH () - que retorna o último dia do mês, de acordo com os parâmetros passados a ela. Observemos sua sintaxe:

StartDate = Data inicial, que serve de ponto de partida para o cálculo que será executado.
Meses = número de meses que deve ser acrescido ou subtraído da Data Inicial, para se chegar ao resultado desejado.
A rigor, são os mesmos argumentos da função EDATE (), porém o resultado é diferente, pois ela “fixa”, digamos assim, a parte do dia, como o último do mês que se está encontrando através dela:
Fim do Mês = EOMONTH (TODAY (),0)
Resultado: 30/06/2022
Neste caso, mantive o uso da função TODAY () no primeiro argumento, pois quero continuar com a avaliação dinâmica da data inicial, e informei “0” (zero), no segundo argumento, fazendo com isto, que a expressão não avançasse, nem retrocedesse na linha do tempo, me retornando o último dia do mês corrente.
Deste modo é óbvio concluir até onde a manipulação deste segundo argumento pode nos levar:
Fim do Mês Passado = EOMONTH (TODAY (), -1)
Resultado: 31/05/2022
Fim do Próximo Mês = EOMONTH (TODAY (), 1)
Resultado: 31/07/2022
Utilizando números positivos, ou negativos, conseguimos avançar ou retroceder no tempo, o tanto que necessitemos para resolver o problema que estiver nos desafiando.
E ainda podemos acrescentar ou reduzir datas, externamente à própria função, usando números positivos ou negativos fora dela, após os parênteses de fechamento.
Nos exemplos anteriores, encontramos o fim do mês anterior, do mês atual e do próximo.
E se for preciso encontrar o COMEÇO, o primeiro dia do mês ATUAL, em vez do último?
Podemos utilizar a mesma expressão com a qual encontramos o último dia do mês anterior, apenas acrescentando 1 dia à mesma:
Começo do Mês = EOMONTH (TODAY (), -1) +1
Resultado: 01/06/2022
Observe que ao final da sintaxe original, após os parênteses de fechamento, apenas acrescentamos o “+1”.
Como o resultado da expressão original é uma data completa, com dia, mês e ano, neste caso “31/05/2022”, este acréscimo resulta no dia seguinte na linha do tempo, que é “01/06/2022”.
Para encontrarmos o último dia do ano atual, de forma dinâmica, precisamos lançar mão de outros artifícios no uso das expressões.
Como estamos em junho, eu sei que preciso acrescentar seis meses para chegar a dezembro, que é o último mês do ano. Mas utilizando este número “6” de forma fixa, eu terei que alterar o argumento de minha função mensalmente, para que eu possa obter sempre o resultado correto:
Fim do Ano = EOMONTH (TODAY(), 6)
Resultado: 31/12/2022
Como tornar este “6” dinâmico? Como deixar este argumento por conta do próprio cálculo em si, de modo que não precisemos mais retornar a ele, para alterá-lo e manter o resultado correto?
Sabemos o número total de meses de um ano: 12.
Então, fixaremos este número 12, e utilizaremos a função MONTH () para obter o número do mês da função TODAY () - ou seja, o número do mês atual, o qual será utilizado para subtrair do número 12, fixo, e se encontrar o número correto de meses que precisam ser acrescidos (ou reduzidos), pela expressão EOMONTH () para se chegar ao final do ano.
Para facilitar a compreensão, vamos calcular este segundo argumento da função EOMONTH () através de uma variável:
Fim do Ano =
VARNumber = 12 - MONTH (TODAY ())
RETURN
Number
Resultado: 6
Agora, após o RETURN, vamos inserir a expressão completa:
Fim do Ano =
VARNumber = 12 - MONTH (TODAY ())
RETURN
EOMONTH (TODAY (), Number)
Resultado: 31/12/2022
A variável “Number” se recalculará automaticamente com o passar do tempo, sempre obedecendo o passar dos meses e retornando um número diferente, deste modo, mantendo o resultado da expressão completa, correto e preciso.
Se precisarmos calcular o início do próximo ano, basta seguirmos a lógica que aplicamos alguns passos antes, e acrescentarmos “+1”, externamente à função principal, para avançarmos uma data na linha do tempo, chegando assim, ao primeiro dia do ano seguinte:
Começo do Ano Seguinte =
VARNumber = 12 - MONTH (TODAY ())
RETURN
EOMONTH (TODAY (), Number) +1
Resultado: 01/01/2023
A expressão é a mesma utilizada no exemplo anterior, exceto pelo “+1” acrescido ao final, já fora dos parênteses, o que leva o cálculo a encontrar a data de 01/01/2023 em vez de 31/12/2022.
Podemos ainda manipular um pouco mais estes artifícios, para encontrar o último dia do ano anterior ao atual:
Fim Ano Anterior =
VAR Number = - MONTH (TODAY ())
RETURN
Number
Resultado: -6
Aqui, a expressão “MONTH (TODAY ())” retornará o número inteiro 6. O sinal de Menos (-) antecedendo a mesma, tornará este número negativo, pois o objetivo é retroceder no tempo, encontrando o último dia do ano anterior.
Encontrando este número, e tornando-o dinâmico, no contexto do que está sendo discutido neste artigo, podemos completar nossa expressão para chegar ao resultado:
Fim Ano Anterior =
VAR Number = - MONTH (TODAY ())
RETURN
EOMONTH (TODAY (), Number)
Resultado: 31/12/2021
Conclui-se que manipulando argumentos internos e externos às funções, é possível desenvolver expressões que nos retornem praticamente qualquer data na linha do tempo, dinamicamente, servindo estas, como novos parâmetros, perfeitos, para controlar outras funções, que nos permitirão cálculos mais complexos e objetivos.
Deixarei aqui, no final do artigo, um gabarito mais organizado das expressões exploradas e de outras possíveis, para servir de consulta aos leitores.
Hoje = TODAY ()
Mesmo Dia Mês Anterior = EDATE (TODAY (), -1)
Mesmo Dia Próximo Mês = EDATE (TODAY (), 1)
Começo do Mês = EOMONTH (TODAY (), -1) +1
Fim do Mês = EOMONTH (TODAY (), 0)
Começo Mês Anterior = EOMONTH (TODAY (), -2) +1
Fim Mês Anterior = EOMONTH (TODAY (), -1)
Começo Próximo Mês = EOMONTH (TODAY (), 0) +1
Fim do Próximo Mês = EOMONTH (TODAY (), 1)
Começo do Ano = EOMONTH (TODAY (), - (MONTH (TODAY ()))) +1
Fim do Ano = EOMONTH (TODAY (), 12 - MONTH (TODAY ()))
Fim Ano Anterior = EOMONTH (TODAY (), - (MONTH (TODAY ())))
Começo Próximo Ano = EOMONTH (TODAY (), 12 - MONTH (TODAY ())) +1