Por que um calendário bem feito muda a qualidade da análise
Quando você analisa vendas, caixa e estoque ao longo do tempo, a tabela de datas (calendário) é o “eixo” que permite comparar períodos, somar corretamente por dia/semana/mês e criar indicadores como acumulado no mês, comparação com o mês anterior e média móvel. Sem um calendário consistente, você fica preso a filtros manuais, comparações imprecisas e visuais que “quebram” quando muda o período selecionado.

No Power BI, a inteligência de tempo (time intelligence) depende de uma tabela de datas contínua, com uma coluna de data sem buracos, marcada como tabela de datas, e relacionada às tabelas de fatos (por exemplo, vendas e recebimentos) por uma coluna de data no mesmo tipo (Date). A partir disso, você consegue criar medidas que respeitam o contexto do relatório (filtros e segmentações) e respondem automaticamente a seleções diárias, semanais e mensais.

Conceitos essenciais de calendário e inteligência de tempo
1) Tabela de datas (DimCalendario)
É uma dimensão que contém uma linha por dia, cobrindo todo o intervalo necessário (do menor ao maior dia presente nos seus dados, e geralmente um pouco além). Ela deve ter colunas auxiliares para facilitar agrupamentos e ordenações: ano, mês, nome do mês, ano-mês, trimestre, semana, dia da semana, etc.
2) Coluna de data “limpa” e contínua
A coluna principal deve ser do tipo Date (sem hora). Se suas tabelas de fatos tiverem DateTime (com hora), você deve criar uma coluna apenas com a data (por exemplo, DataVenda = DATE(YEAR([DataHora]), MONTH([DataHora]), DAY([DataHora]))), para garantir relacionamento correto.
3) Marcar como tabela de datas
No Power BI, ao marcar a DimCalendario como “tabela de datas”, você habilita comportamentos esperados de funções de time intelligence e evita ambiguidades quando há múltiplas colunas de data.
Continue em nosso aplicativo
Você poderá ouvir o audiobook com a tela desligada, ganhar gratuitamente o certificado deste curso e ainda ter acesso a outros 5.000 cursos online gratuitos.
ou continue lendo abaixo...Baixar o aplicativo
4) Contexto de filtro e medidas
Time intelligence funciona melhor com medidas (DAX) e não com colunas calculadas. Medidas se recalculam conforme o usuário filtra por período, loja, categoria, vendedor etc. O calendário fornece o contexto temporal; as medidas interpretam esse contexto para calcular “mês atual”, “mês anterior”, “acumulado no ano”, e assim por diante.
5) Semanas: cuidado com padrão e início da semana
“Semana” pode significar coisas diferentes: semana ISO (padrão internacional), semana começando no domingo, ou semana começando na segunda. Para pequenos negócios, o mais importante é escolher um padrão e manter consistente. Se você usa metas semanais e rotina de fechamento às segundas, semana iniciando na segunda costuma ser mais natural. Se seu negócio opera com relatórios de domingo a sábado, ajuste para domingo.
Passo a passo: criando um calendário robusto no Power BI
Passo 1: Defina o intervalo de datas
Você pode criar um calendário que cobre automaticamente o intervalo existente nas tabelas de fatos. Exemplo: usar a menor e a maior data de vendas/recebimentos. Em muitos cenários, é útil adicionar uma “margem” (por exemplo, mais 1 ano) para permitir planejamento e metas futuras.
Passo 2: Crie a tabela de calendário em DAX
Uma forma prática é criar uma tabela calculada. No Power BI Desktop: Modelagem > Nova tabela. Exemplo de calendário básico com colunas úteis:
DimCalendario = VAR DataMin = DATE(2023,1,1) VAR DataMax = DATE(2026,12,31) RETURN ADDCOLUMNS( CALENDAR(DataMin, DataMax), "Ano", YEAR([Date]), "MesNumero", MONTH([Date]), "MesNome", FORMAT([Date], "mmmm"), "AnoMes", FORMAT([Date], "yyyy-MM"), "Trimestre", "T" & FORMAT([Date], "Q"), "Dia", DAY([Date]), "DiaSemanaNumero", WEEKDAY([Date], 2), "DiaSemanaNome", FORMAT([Date], "dddd") )Observações práticas: (1) Use WEEKDAY([Date], 2) para semana começando na segunda (1=segunda, 7=domingo). (2) MesNome e DiaSemanaNome dependem do idioma/região do arquivo; se você precisa padronizar, pode mapear manualmente com SWITCH.
Passo 3: Crie colunas para ordenação correta
Em visuais, “Janeiro, Fevereiro…” pode aparecer fora de ordem se o Power BI ordenar alfabeticamente. Para resolver, ordene o nome do mês pelo número do mês. O mesmo vale para dia da semana.
- Ordenar
MesNomeporMesNumero - Ordenar
DiaSemanaNomeporDiaSemanaNumero
No Power BI: selecione a coluna (ex.: MesNome) > Ferramentas de coluna > Ordenar por coluna > MesNumero.
Passo 4: Crie colunas de “início do mês” e “início da semana” (muito úteis)
Essas colunas ajudam a agrupar e também a criar comparações consistentes.
InicioMes = DATE(YEAR(DimCalendario[Date]), MONTH(DimCalendario[Date]), 1)InicioSemana = DimCalendario[Date] - (DimCalendario[DiaSemanaNumero] - 1)Com InicioSemana, você consegue criar um eixo semanal que não depende de “número da semana” (que muda conforme o padrão) e evita confusão em viradas de ano.
Passo 5: Marque a tabela como tabela de datas
No Power BI: selecione a DimCalendario > Ferramentas de tabela > Marcar como tabela de datas > escolha a coluna [Date].
Passo 6: Relacione a DimCalendario às tabelas de fatos
Crie relacionamentos 1:* da DimCalendario para cada fato que tenha data relevante (vendas, recebimentos, despesas, movimentação de estoque). Boas práticas para evitar confusão:
- Use uma coluna “Data” do tipo Date em cada fato (sem hora).
- Se uma tabela tiver múltiplas datas (ex.: data do pedido e data do pagamento), mantenha um relacionamento ativo para a data principal do relatório e use relacionamentos inativos para datas alternativas, ativando-os em medidas com
USERELATIONSHIPquando necessário.
Inteligência de tempo na prática: medidas para dia, semana e mês
As medidas abaixo assumem que você já tem uma medida base de valor, por exemplo:
Vendas (R$) = SUM(FatoVendas[ValorTotal])A partir dela, você cria medidas de comparação e acumulados. O padrão é: uma medida base bem definida e medidas derivadas para cada necessidade temporal.
1) Análise diária: hoje, ontem e variação
Para análise diária, é comum querer “Hoje”, “Ontem” e diferença. Porém, em relatórios, “hoje” depende do último dia com dados (nem sempre é o dia atual do calendário). Uma abordagem prática é usar o último dia com vendas no contexto atual.
UltimaDataComVendas = CALCULATE( MAX(DimCalendario[Date]), FILTER( ALL(DimCalendario[Date]), NOT ISBLANK([Vendas (R$)]) ) )Vendas no Ultimo Dia = VAR d = [UltimaDataComVendas] RETURN CALCULATE( [Vendas (R$)], DimCalendario[Date] = d )Vendas no Dia Anterior = VAR d = [UltimaDataComVendas] RETURN CALCULATE( [Vendas (R$)], DATEADD(DimCalendario[Date], -1, DAY), DimCalendario[Date] = d )Observação: dependendo do modelo, você pode simplificar “dia anterior” usando apenas DATEADD no contexto do dia selecionado. A versão acima força a comparação com base no último dia com dados, útil para cartões (cards) sem filtro de data.
2) Análise semanal: semana atual, semana anterior e acumulado na semana
Para semana, você pode trabalhar com “início da semana” como agrupador. Em um gráfico, use InicioSemana no eixo e a medida de vendas como valor. Para comparar semana a semana:
Vendas Semana Anterior = CALCULATE( [Vendas (R$)], DATEADD(DimCalendario[Date], -7, DAY) )Se você quer “acumulado na semana” (do início da semana até o dia selecionado), crie:
Vendas Acumuladas na Semana = VAR DataAtual = MAX(DimCalendario[Date]) VAR Inicio = DataAtual - (WEEKDAY(DataAtual, 2) - 1) RETURN CALCULATE( [Vendas (R$)], DATESBETWEEN(DimCalendario[Date], Inicio, DataAtual) )Isso é útil para acompanhar o andamento da semana em tempo real, especialmente em negócios com metas semanais.
3) Análise mensal: MTD, mês anterior e comparação percentual
Para mês, os padrões mais usados são MTD (Month-to-Date) e comparação com o mês anterior.
Vendas MTD = TOTALMTD( [Vendas (R$)], DimCalendario[Date] )Vendas Mes Anterior = CALCULATE( [Vendas (R$)], DATEADD(DimCalendario[Date], -1, MONTH) )Vendas MTD Mes Anterior = CALCULATE( [Vendas MTD], DATEADD(DimCalendario[Date], -1, MONTH) )Vendas Var % vs Mes Anterior = DIVIDE( [Vendas (R$)] - [Vendas Mes Anterior], [Vendas Mes Anterior] )Exemplo prático de uso: em um cartão, mostre “Vendas MTD” e ao lado “Vendas MTD Mês Anterior” para comparar o ritmo do mês atual até o mesmo ponto do mês anterior (comparação mais justa do que comparar mês fechado com mês em andamento).
4) Análise mensal com “mesmo dia do mês” (comparação justa)
Se hoje é dia 10, comparar o MTD atual (1 a 10) com o mês anterior inteiro distorce. Uma forma simples é comparar MTD com MTD do mês anterior (medida acima). Outra opção é comparar até o mesmo “dia do mês” do período anterior, que é exatamente o que o MTD do mês anterior faz quando o contexto é o mesmo dia.
5) Acumulado no ano (YTD) e comparação com ano anterior
Vendas YTD = TOTALYTD( [Vendas (R$)], DimCalendario[Date] )Vendas Ano Anterior = CALCULATE( [Vendas (R$)], DATEADD(DimCalendario[Date], -1, YEAR) )Vendas YTD Ano Anterior = CALCULATE( [Vendas YTD], DATEADD(DimCalendario[Date], -1, YEAR) )Em pequenos negócios, YTD é útil para enxergar sazonalidade e entender se o ano está “à frente” ou “atrás” do ritmo do ano anterior.
Calendário para caixa e recebimentos: datas diferentes, perguntas diferentes
Em vendas e caixa, a “data” pode significar coisas distintas: data da venda (competência) e data do recebimento (caixa). Para análise diária/semanal/mensal correta, você precisa escolher qual data está respondendo à pergunta do visual.

- Se a pergunta é “quanto vendi?”, use a data da venda.
- Se a pergunta é “quanto entrou no caixa?”, use a data do recebimento.
Quando uma mesma tabela possui duas datas, o padrão é: um relacionamento ativo com a data mais usada e outro relacionamento inativo com a data alternativa. Em medidas específicas, você ativa o relacionamento inativo com USERELATIONSHIP.
Recebimentos (R$) = SUM(FatoRecebimentos[ValorRecebido])Recebimentos por Data de Pagamento = CALCULATE( [Recebimentos (R$)], USERELATIONSHIP(DimCalendario[Date], FatoRecebimentos[DataPagamento]) )Assim, você pode ter um painel mensal de “Vendas (competência)” e “Recebimentos (caixa)” usando o mesmo calendário, mas cada medida apontando para a data correta.
Semanas e meses em visuais: como montar e evitar armadilhas
Eixo diário
Use DimCalendario[Date] no eixo. Para evitar “buracos” em dias sem movimento, mantenha a DimCalendario contínua e, no visual, habilite a opção de mostrar itens sem dados quando fizer sentido (por exemplo, para ver dias zerados).
Eixo semanal
Prefira InicioSemana no eixo. Se você usar “Número da semana”, pode ter problemas na virada do ano (semana 1 aparece junto com semana 52 sem distinção). Se ainda quiser número da semana, crie também um identificador do tipo Ano-Semana.
AnoSemana = FORMAT(DimCalendario[Date], "yyyy") & "-S" & FORMAT( WEEKNUM(DimCalendario[Date], 2), "00" )Se usar AnoSemana, ordene por uma coluna numérica equivalente (por exemplo, Ano*100 + Semana) para manter a ordem correta.
Eixo mensal
Use AnoMes no eixo para evitar misturar meses de anos diferentes. Exemplo: “2025-01, 2025-02…”. Se preferir exibir “Jan/2025”, crie uma coluna de rótulo e ordene por uma coluna numérica (Ano*100 + Mês).
AnoMesNum = YEAR(DimCalendario[Date]) * 100 + MONTH(DimCalendario[Date])AnoMesLabel = FORMAT(DimCalendario[Date], "mmm/yyyy")Depois, ordene AnoMesLabel por AnoMesNum.
Exemplo guiado: construindo um painel de análise diária, semanal e mensal
Objetivo do exemplo
Você quer um relatório com: (1) um gráfico diário das vendas dos últimos 30 dias, (2) um gráfico semanal das últimas 12 semanas, (3) um gráfico mensal dos últimos 12 meses, e (4) cartões com MTD e variação vs mês anterior.
Passo 1: Segmentação de data (filtro)
Adicione uma segmentação usando DimCalendario[Date]. Configure como “Entre” ou “Relativo” (por exemplo, últimos 30 dias) dependendo do layout. Se você usar filtros relativos, garanta que o calendário cobre até a data atual.
Passo 2: Gráfico diário (últimos 30 dias)
- Eixo:
DimCalendario[Date] - Valores:
[Vendas (R$)] - Filtro do visual: data nos últimos 30 dias (ou use segmentação)
Se o gráfico ficar “serrilhado”, isso é normal em varejo; para suavizar a leitura, você pode adicionar uma média móvel de 7 dias.
Vendas Media Movel 7d = AVERAGEX( DATESINPERIOD(DimCalendario[Date], MAX(DimCalendario[Date]), -7, DAY), [Vendas (R$)] )Passo 3: Gráfico semanal (últimas 12 semanas)
- Eixo:
DimCalendario[InicioSemana] - Valores:
[Vendas (R$)] - Filtro do visual: últimas 12 semanas (você pode filtrar por data usando um intervalo de 84 dias)
Se você quiser comparar semana atual vs semana anterior em colunas lado a lado, use duas medidas: [Vendas (R$)] e [Vendas Semana Anterior]. Em muitos casos, um gráfico de linhas com as duas séries facilita a leitura.
Passo 4: Gráfico mensal (últimos 12 meses)
- Eixo:
DimCalendario[AnoMesLabel](ordenado porAnoMesNum) - Valores:
[Vendas (R$)] - Filtro do visual: últimos 12 meses
Para destacar sazonalidade, você pode adicionar uma linha de referência com a média dos 12 meses.
Vendas Media 12m = AVERAGEX( DATESINPERIOD(DimCalendario[Date], MAX(DimCalendario[Date]), -12, MONTH), [Vendas (R$)] )Passo 5: Cartões mensais (MTD e variação)
- Cartão 1:
[Vendas MTD] - Cartão 2:
[Vendas MTD Mes Anterior] - Cartão 3:
[Vendas Var % vs Mes Anterior]
Formate a variação percentual como porcentagem e use regras de cor (condicional) para facilitar leitura (positivo/negativo), se o seu padrão visual permitir.
Erros comuns e como evitar
1) Usar a data da fato diretamente no eixo
Isso funciona em casos simples, mas você perde consistência quando precisa comparar períodos, mostrar dias sem movimento, ou usar funções de time intelligence. Prefira sempre o eixo vindo da DimCalendario.
2) Ter datas com hora e relacionamentos falhando
Se a fato tem DateTime e o calendário tem Date, o relacionamento pode não casar corretamente. Solução: crie uma coluna somente com a data na fato e relacione por ela.
3) Mês e dia da semana fora de ordem
Resolva com “Ordenar por coluna” (mês por número do mês, dia da semana por número do dia).
4) Comparar mês em andamento com mês fechado
Use MTD vs MTD do mês anterior para comparar “ritmo” do mês. Isso evita interpretações erradas como “este mês caiu”, quando na verdade o mês ainda não terminou.
5) Semana sem padrão definido
Defina se a semana começa no domingo ou segunda e aplique em todas as colunas/medidas. Se você usa WEEKNUM, escolha o parâmetro correto e mantenha consistente com WEEKDAY.
Checklist rápido para validar seu calendário
- A DimCalendario tem uma linha por dia, sem buracos, cobrindo todo o período necessário.
- A coluna principal é do tipo Date e a tabela está marcada como tabela de datas.
- Meses e dias da semana estão ordenados por colunas numéricas.
- Existe uma coluna de AnoMes (e/ou AnoMesNum) para eixos mensais.
- Existe uma coluna de InicioSemana (ou AnoSemana) para eixos semanais consistentes.
- Todas as tabelas de fatos se relacionam à DimCalendario por colunas Date (sem hora).
- Medidas de MTD/YTD e comparações usam a DimCalendario[Date] como referência.