Introdução
A Tabela Calendário resolve um problema direto no Power BI: sem ela, as principais funções de análise temporal do DAX simplesmente não funcionam — TOTALYTD retorna em branco, SAMEPERIODLASTYEAR traz o período errado, e o dashboard que deveria comparar mês a mês fica inconsistente sem que você entenda o motivo.
O problema não está na fórmula. Está na fundação do modelo. Toda medida de inteligência de tempo no Power BI depende de uma tabela de datas dedicada, corretamente configurada e conectada à tabela de fatos. Sem isso, o Power BI não tem como saber como navegar no tempo.
Neste artigo você vai entender por que a Tabela Calendário é obrigatória, quais são os três métodos para criá-la (e quando usar cada um), como configurá-la corretamente e quais erros derrubam as medidas mesmo quando a tabela já existe.
Esse artigo é para você se:
- Criou uma medida TOTALYTD ou SAMEPERIODLASTYEAR ou outra medida DAX e ela retornou em branco ou trouxe um número que claramente não faz sentido
- Está usando a coluna de data da sua base de dados diretamente nos visuais e os filtros de período estão dando resultados inconsistentes
- Já ouviu falar em Tabela Calendário, mas nunca entendeu por que ela é importante — ou achou que a data automática do Power BI já resolvia
Por que a Tabela Calendário existe — e por que a coluna de data da tabela fato não resolve
Quando você importa uma base de dados para o Power BI, e ela possui uma coluna de data. A tentação natural é usar essa coluna diretamente nos visuais e nas medidas. Por um tempo, até funciona.
O problema aparece quando você precisa ir além de um simples total: comparar com o mesmo período do ano anterior, calcular o acumulado desde o início do ano, ou montar um gráfico de tendência mensal com todos os meses representados — inclusive os que não tiveram movimentação.
A coluna de data da tabela fato tem apenas as datas em que houve registro. Se não houve venda, pedido, movimentação etc., em 15 de março por exemplo, esse dia não existe na tabela. Para as funções de inteligência de tempo no Power BI, isso é um problema grave: elas precisam de um calendário contínuo, sem furos, cobrindo anos completos, para navegar corretamente entre períodos.
A Tabela Calendário resolve isso criando uma tabela separada com uma linha para cada dia do intervalo — todos os dias, independentemente de haver dados naquele período. Ela é conectada à tabela fato por um relacionamento e, a partir daí, todas as medidas temporais passam por ela.
A regra é simples: toda análise temporal passa por uma única Tabela Calendário. Um modelo sem ela é um modelo que funciona até o dia em que os dados crescem ou as medidas ficam mais complexas, e então tudo começa a dar errado sem motivo aparente.
Os três métodos de criação — e quando usar cada um
Antes de entrar no passo a passo de cada método, esta tabela ajuda a escolher o caminho certo para a sua situação:
| Critério | DAX — CALENDAR | DAX — CALENDARAUTO | Power Query (M) |
| Como define o intervalo | Você informa início e fim manualmente | Detecta automaticamente as datas do modelo | Você define via parâmetros dinâmicos |
| Atualiza com os dados | Não — intervalo fixo no código | Sim — acompanha as datas do modelo | Sim — pode ser configurado para isso |
| Quando usar | Intervalo conhecido e estável (ex.: 2020 a 2026) | Modelos simples em que o intervalo deve seguir os dados | Projetos que precisam de flexibilidade máxima e dinâmica |
| Complexidade | Baixa | Muito baixa | Média |
| Funciona em DirectQuery | Não | Não | Sim (se criada na fonte) |
| Recomendado para iniciantes | Sim | Sim | Com reservas |
A Microsoft recomenda o uso de DAX para criar a Tabela Calendário — a linguagem inclui inteligência nativa que simplifica a criação e o gerenciamento de tabelas de datas. Power Query é uma boa alternativa quando você precisa de uma tabela dinâmica e já tem familiaridade com a linguagem M, mas em termos de performance não há diferença significativa entre os dois caminhos.
Método 1: criando a Tabela Calendário com DAX (CALENDAR)
Este é o método mais direto. A função CALENDAR recebe uma data de início e uma data de fim e retorna uma tabela com uma linha por dia nesse intervalo. Com ADDCOLUMNS, você enriquece essa tabela com as colunas que vai precisar nos visuais e nas medidas.
Passo 1 — Criar a tabela calculada
Na barra de ferramentas do Power BI Desktop, vá em Modelagem > Nova Tabela e insira o seguinte código:

dCalendario =
ADDCOLUMNS(
CALENDAR(
DATE(YEAR(MIN(Vendas[DataVenda])), 1, 1),
DATE(YEAR(MAX(Vendas[DataVenda])), 12, 31)),
"Ano", YEAR([Date]),
"Mês Num", MONTH([Date]),
"Mês Nome", FORMAT([Date], "MMMM"),
"Mês Abrev", FORMAT([Date], "MMM"),
"Trimestre", "T" & FORMAT([Date], "Q"),
"Semana", WEEKNUM([Date], 2),
"Dia Semana Num", WEEKDAY([Date], 2),
"Dia Semana Nome", FORMAT([Date], "DDDD"),
"Mês/Ano", FORMAT([Date], "MMM/YYYY"),
"Ano/Mês Num", YEAR([Date]) * 100 + MONTH([Date])
)
O que está acontecendo aqui:
- Vendas e DataVenda são os nomes usados neste exemplo. Substitua pelo nome da sua tabela e a coluna onde estão as datas no seu modelo. Se sua tabela se chama fVendas e a coluna de data é dtPedido, o código fica MIN(fVendas[dtPedido]) e MAX(fVendas[dtPedido]).
- MIN(Vendas[DataVenda]) e MAX(Vendas[DataVenda]) detectam a primeira e a última data registrada na sua tabela de dados — sem precisar fixar datas no código
- DATE(YEAR(…), 1, 1) e DATE(YEAR(…), 12, 31) expandem esse intervalo para cobrir anos completos (de 1º de janeiro a 31 de dezembro), o que é um requisito obrigatório para as funções de inteligência de tempo do DAX
- ADDCOLUMNS enriquece a tabela com colunas calculadas linha a linha — cada [Date] dentro das fórmulas se refere à data daquela linha específica
- A coluna Ano/Mês Num gera um número inteiro no formato YYYYMM (ex.: 202403 para março de 2024) que serve como índice de ordenação quando você precisar que um gráfico ou tabela exiba os períodos em ordem cronológica correta
- ADDCOLUMNS Adiciona colunas extras à tabela gerada pelo CALENDAR
- DATE(YEAR(MIN(Vendas[DataVenda])), 1, 1), início: 1º de janeiro do ano mais antigo nos dados
- DATE(YEAR(MAX(Vendas[DataVenda])), 12, 31), Fim: 31 de dezembro do ano mais recente nos dados
- “Ano”, YEAR([Date]), Ex.: 2024
- “Mês Num”, MONTH([Date]), Ex.: 3 (para março)
- “Mês Nome”, FORMAT([Date], “MMMM”), Ex.: março
- “Mês Abrev”, FORMAT([Date], “MMM”), Ex.: mar
- “Trimestre”, “T” & FORMAT([Date], “Q”), Ex.: T1
- “Semana”, WEEKNUM([Date], 2), Número da semana no ano (segunda como início)
- “Dia Semana Num”, WEEKDAY([Date], 2), Ex.: 1 = segunda, 7 = domingo
- “Dia Semana Nome”, FORMAT([Date], “DDDD”), Ex.: segunda-feira
- “Mês/Ano”, FORMAT([Date], “MMM/YYYY”), Ex.: mar/2024
- “Ano/Mês Num”, YEAR([Date]) * 100 + MONTH([Date]), Ex.: 202403 (índice para ordenação correta)

Sobre o nome “dCalendario”: o prefixo d é uma convenção comum em modelagem dimensional para indicar que se trata de uma tabela de dimensão (o “d” vem de dimension). Você pode nomear a tabela como quiser — “Calendario”, “datas”, “TabelaDatas” — o nome não interfere no funcionamento. O importante é manter consistência dentro do seu projeto.
Passo 2 — Corrigir a ordenação do Mês Nome
Por padrão, a coluna Mês Nome é ordenada alfabeticamente — Abril, Agosto, Dezembro… — o que bagunça qualquer gráfico de tendência mensal. Para corrigir:
- No painel Campos, clique na coluna Mês Nome
- Na faixa de opções, vá em Ferramentas de Coluna > Classificar por Coluna
- Escolha Mês Num
A partir daí, qualquer visual que usar Mês Nome vai exibir os meses em ordem cronológica.

Passo 3 — Marcar como Tabela de Datas
Este passo é obrigatório para que as funções de inteligência de tempo clássica do DAX — TOTALYTD, SAMEPERIODLASTYEAR, DATEADD e similares — reconheçam a tabela corretamente.
- No painel Campos ou na Vista de Modelo, clique com o botão direito em dCalendario;
- Selecione Marcar como Tabela de Datas;
- Na janela que abrir, escolha a coluna Date como coluna de data;
- Clique em OK.


Passo 4 — Criar o relacionamento com a tabela fato
- Vá para a Exibição de Modelo (ícone de diagrama na barra lateral);
- Arraste a coluna Date da dCalendario até a coluna de data da sua tabela fato (ex.: DataVenda da tabela Vendas);
- Confirme que o relacionamento ficou muitos-para-um (lado “muitos” na tabela fato, lado “um” na dCalendario);
- Direção do filtro: Única (da dCalendario para a tabela fato).


Método 2: criando com CALENDARAUTO
CALENDARAUTO é a versão simplificada: ela detecta automaticamente o menor e o maior valor de data em todo o modelo e gera o calendário cobrindo esses anos completos — sem que você precise referenciar nenhuma tabela ou coluna.
dCalendario =
ADDCOLUMNS(
CALENDARAUTO(),
"Ano", YEAR([Date]),
"Mês Num", MONTH([Date]),
"Mês Nome", FORMAT([Date], "MMMM"),
"Trimestre", "T" & FORMAT([Date], "Q"),
"Mês/Ano", FORMAT([Date], "MMM/YYYY"),
"Ano/Mês Num", YEAR([Date]) * 100 + MONTH([Date])
)
Use CALENDARAUTO quando não quiser fixar as datas de início e fim no código. A desvantagem é que ela varre todas as colunas de data do modelo — incluindo tabelas auxiliares ou de parâmetro — e pode gerar um intervalo maior do que o necessário.
Os passos de ordenação, marcação e relacionamento são os mesmos do Método 1.
Método 3: criando com Power Query (M)
O método via Power Query é mais indicado quando você quer uma tabela dinâmica que detecta as datas da tabela fato e se atualiza automaticamente, sem depender de código DAX.
Se você trabalha mais no Power Query do que no DAX, pode criar a Tabela Calendário diretamente no Editor de Consultas usando a função List.Dates.
Como criar: Página Inicial → Obter Dados → Consulta em Branco

Editor Avançado → cole o código abaixo:
let
DataInicio = #date(2022, 1, 1),
DataFim = Date.From(DateTime.LocalNow()),
TotalDias = Duration.Days(DataFim - DataInicio) + 1,
ListaDatas = List.Dates(DataInicio, TotalDias, #duration(1, 0, 0, 0)),
Tabela = Table.FromList(ListaDatas, Splitter.SplitByNothing(), {"Date"}),
TipoData = Table.TransformColumnTypes(Tabela, {{"Date", type date}}),
AddAno = Table.AddColumn(TipoData, "Ano", each Date.Year([Date]), Int64.Type),
AddMesNum = Table.AddColumn(AddAno, "MesNum", each Date.Month([Date]), Int64.Type),
AddNomeMes = Table.AddColumn(AddMesNum, "NomeMes", each Date.MonthName([Date]), type text),
AddTrim = Table.AddColumn(AddNomeMes, "Trimestre", each "T" & Text.From(Date.QuarterOfYear([Date])), type text),
AddDiaSem = Table.AddColumn(AddTrim, "DiaSemana", each Date.DayOfWeek([Date], Day.Monday) + 1, Int64.Type),
AddFimSem = Table.AddColumn(AddDiaSem, "FimDeSemana", each if Date.DayOfWeek([Date], Day.Monday) >= 5 then "Sim" else "Não", type text)
in
AddFimSem

Após colar o código, clique em OK e renomeie a consulta para dCalendario. O Power Query vai gerar a tabela com atualização dinâmica — a data final sempre será apontada para a data atual.

Erros comuns — e como corrigir cada um
Erro 1: TOTALYTD e SAMEPERIODLASTYEAR retornam BLANK
Causa: A tabela não foi marcada como Tabela de Datas, ou a coluna de data tem valores duplicados, nulos ou datas ausentes no intervalo.
Como diagnosticar: No Power Query, verifique a qualidade da coluna Date — ela precisa ter 100% de valores válidos, sem nulos e sem duplicatas. Clique na coluna e veja o perfil de coluna (guia Exibição > Perfil de Coluna).
Solução:
- Confirme que a tabela está marcada como Tabela de Datas (botão direito na tabela > Marcar como Tabela de Datas);
- Verifique se o intervalo da CALENDAR ou CALENDARAUTO cobre todas as datas da tabela fato — inclusive datas futuras se houver pedidos com entrega futura por exemplo;
- Se a coluna de data da tabela fato é do tipo DateTime (data com hora, exemplo 15/03/2024 14:32:00), o jeito mais simples de resolver é converter essa coluna diretamente no Power Query: selecione a coluna, clique no ícone de tipo ao lado do nome e escolha Data (sem hora). Isso padroniza o tipo antes de criar o relacionamento, sem precisar criar colunas calculadas adicionais.
Erro 2: Mês Nome aparece em ordem alfabética no visual
Causa: A coluna Mês Nome é do tipo texto e, sem instrução contrária, o Power BI ordena texto em ordem alfabética.
Solução: Selecione a coluna Mês Nome no painel Campos > Ferramentas de Coluna > Classificar por Coluna > Mês Num. Isso faz o Power BI usar o número do mês como critério de ordenação ao exibir o nome.
Erro 3: Medidas somam corretamente, mas os filtros de data não propagam para outras tabelas
Causa: O relacionamento entre a dCalendario e a tabela fato está com direção de filtro bidirecional, ou há múltiplas tabelas fato sem relacionamentos individuais com o calendário.
Solução: Mantenha o relacionamento com direção de filtro Única (da dCalendario para a tabela fato).
Se você tem mais de uma tabela fato — por exemplo, uma tabela Vendas e uma tabela Devoluções — sim, você pode (e deve) criar um relacionamento separado da dCalendario com cada uma delas. Uma única dCalendario pode ter múltiplos relacionamentos ativos, um para cada tabela fato, desde que cada relacionamento seja um-para-muitos com direção de filtro única. O resultado é que um filtro de data aplicado via dCalendario vai propagar corretamente para as duas tabelas ao mesmo tempo — sem precisar duplicar a tabela de datas.
O que não deve ser feito é usar filtro bidirecional como atalho para esse problema — isso cria ambiguidade no modelo e pode gerar resultados incorretos em medidas mais complexas.
Erro 4: O intervalo de datas da tabela não cobre todos os registros
Causa: O código DAX usa datas fixas (ex.: DATE(2022, 1, 1)) e o modelo recebeu dados fora desse intervalo.
Solução: Use sempre MIN e MAX dinâmicos referenciando a tabela fato, como no exemplo do Método 1. Isso garante que o calendário se expanda automaticamente quando novos dados chegarem.
Erro 5: Coluna “Mês/Ano” não ordena corretamente em gráficos de linha
Causa: A coluna Mês/Ano é texto (ex.: “Jan/2024”) e o Power BI ordena alfabeticamente, colocando “Abr/2024” antes de “Jan/2024”.Solução: Crie a coluna Ano/Mês Num (número inteiro no formato YYYYMM, ex.: 202401 para janeiro de 2024) e classifique Mês/Ano por ela, seguindo o mesmo processo do Erro 2
Dicas avançadas
Dica 1: Ano fiscal diferente do ano civil
Se a sua empresa tem um calendário fiscal que não começa em janeiro — comum em empresas com ano fiscal encerrando em junho, setembro ou março — você pode incluir uma coluna de Ano Fiscal na dCalendario e usar um parâmetro extra na função TOTALYTD para que o acumulado siga o ano fiscal, não o calendário civil.
O que é TOTALYTD: é uma função DAX que calcula o acumulado de uma medida desde o primeiro dia do ano até a data selecionada no relatório.
TOTALYTD(Expressão, Dates, [Filtrar], [YearEndDate]).
Por padrão, ela assume que o ano começa em 1º de janeiro. O terceiro parâmetro (opcional) permite informar uma data de encerramento diferente — útil exatamente para anos fiscais personalizados.
Onde inserir a coluna de Ano Fiscal: dentro do ADDCOLUMNS do código da dCalendario, logo após as colunas existentes, como mais um par “nome da coluna”, expressão DAX:
dCalendario =
ADDCOLUMNS(
CALENDAR(
DATE(YEAR(MIN(Vendas[DataVenda])), 1, 1),
DATE(YEAR(MAX(Vendas[DataVenda])), 12, 31)),
"Ano", YEAR([Date]),
"Mês Num", MONTH([Date]),
"Mês Nome", FORMAT([Date], "MMMM"),
"Mês Abrev", FORMAT([Date], "MMM"),
"Trimestre", "T" & FORMAT([Date], "Q"),
"Semana", WEEKNUM([Date], 2),
"Dia Semana Num", WEEKDAY([Date], 2),
"Dia Semana Nome", FORMAT([Date], "DDDD"),
"Mês/Ano", FORMAT([Date], "MMM/YYYY"),
"Ano/Mês Num", YEAR([Date]) * 100 + MONTH([Date]),
-- Coluna de Ano Fiscal (exemplo: ano fiscal encerra em junho)
-- Meses de julho a dezembro já pertencem ao próximo ano fiscal
"Ano Fiscal", IF(MONTH([Date]) >= 7, YEAR([Date]) + 1, YEAR([Date]))
)
Medida YTD Fiscal — no exemplo abaixo, o ano fiscal encerra em 30 de junho:
Vendas YTD Fiscal =
TOTALYTD(
[Total Vendas], -- A medida que você quer acumular
dCalendario[Date], -- A coluna de data da sua dCalendario
"06-30" -- Data de encerramento do ano fiscal (mês-dia)
)
O parâmetro “06-30” informa ao DAX que o ano fiscal encerra em 30 de junho — o acumulado vai de 1º de julho até a data selecionada no relatório. Para outros encerramentos, ajuste a data: “03-31” para março, “09-30” para setembro.
Dica 2: Incluir coluna de feriados para análises de dias úteis
Nem toda análise deve contar todos os dias do calendário. Se você precisa saber quantos dias úteis foram trabalhados, ou excluir feriados de uma média de atendimentos por dia, a dCalendario pode incluir essa informação — e as medidas passam a filtrar por ela.
A implementação tem duas partes: identificar fins de semana (direto na dCalendario) e identificar feriados (via uma tabela auxiliar).
Parte 1 — Coluna de Dia Útil na dCalendario
Adicione a coluna abaixo no ADDCOLUMNS da sua dCalendario. Ela marca fins de semana como “Não” e os demais dias como “Sim”:
"Dia Útil", IF(WEEKDAY([Date], 2) <= 5, "Sim", "Não")
WEEKDAY com parâmetro 2: 1 = segunda, 5 = sexta, 6 = sábado, 7 = domingo

Parte 2 — Tabela de Feriados e coluna “É Feriado” na dCalendario
Siga este passo a passo para incluir feriados nacionais no modelo:
Passo 2.1: No Power BI Desktop, vá em Página Inicial > Inserir Dados. Crie uma tabela chamada Feriados com duas colunas: Data (tipo Date) e Descrição (tipo Texto). Insira as datas dos feriados nacionais que deseja considerar, ou simplesmente importe uma tabela com os feriados.

Passo 2.2: Na dCalendario, adicione a coluna abaixo (dentro do ADDCOLUMNS, após a coluna “Dia Útil”):
"É Feriado", IF(NOT(ISBLANK(LOOKUPVALUE(Feriados[Descricao], Feriados[Data], [Date]))), "Sim", "Não")

O que a função LOOKUPVALUE faz aqui: ela procura, na tabela Feriados, se existe alguma linha em que a coluna Data seja igual à data da linha atual da dCalendario ([Date]). Se encontrar, retorna a descrição do feriado; se não encontrar, retorna BLANK. O IF(NOT(ISBLANK(…))) converte esse resultado em “Sim” ou “Não”.
Agora com as duas colunas na dCalendario, você pode criar medidas que excluem fins de semana e feriados.
Conclusão
A Tabela Calendário não é um recurso avançado reservado para modelos complexos — ela é a fundação de qualquer modelo que precise comparar períodos, calcular acumulados ou exibir tendências ao longo do tempo. Sem ela, as medidas DAX de inteligência de tempo retornam resultados incorretos ou em branco, e o dashboard perde a confiabilidade que justifica seu uso para tomar decisões.
Com a Tabela Calendario criada, marcada como Tabela de Datas e conectada corretamente à tabela fato, você passa a ter controle real sobre o tempo no modelo — e medidas como TOTALYTD, SAMEPERIODLASTYEAR e DATEADD funcionam como esperado, sem mistério.
O próximo passo natural é aprender a usar essas medidas com mais profundidade: como combinar TOTALYTD com filtros de categoria, como criar variações percentuais entre períodos e como estruturar um dashboard de acompanhamento mensal completo.
Sobre o Autor
0 Comentários