Partilhar via


Implementar cálculos baseados no tempo no Power BI

O Power BI oferece várias ferramentas para executar cálculos baseados em tempo, que dependem de tabelas de data automáticas ou tabelas de data adicionadas.

Recomendamos o uso de inteligência de tempo baseada em calendário (visualização) porque oferece o melhor desempenho e a mais alta faixa de flexibilidade para atender a qualquer calendário.

Esta tabela compara as três ferramentas fornecidas:

Tool Esforço de configuração necessário Facilidade de gestão Flexibilidade Observações
Data/hora automática praticamente zero difícil baixo Aumenta o tamanho do modelo devido a várias tabelas de data ocultas criadas
Inteligência de tempo clássica meio fácil baixo Requer a criação de uma tabela de datas, assume calendário gregoriano ou gregoriano deslocado, sofre de problemas de desempenho em alguns cenários específicos
Inteligência de tempo baseada em calendário alto meio alto Recomendado para criar uma tabela de datas, maior flexibilidade, melhor desempenho, mas maior custo de configuração

Observação

Aconselhamos contra o uso de técnicas alternativas de inteligência de tempo, particularmente aquelas que envolvem a adição de colunas extras a tabelas de data para calcular compensações, exceto para casos de uso específicos. Embora essas abordagens possam atrair iniciantes devido às suas fórmulas DAX diretas, elas tendem a inflar modelos semânticos desnecessariamente. Esse inchaço pode levar a atualizações de dados mais lentas e a um desempenho de relatório menor à medida que os conjuntos de dados crescem.

Data/hora automática

O recurso de data/hora automática cria automaticamente tabelas de data ocultas para cada campo de data em seu modelo de dados. Para obter mais informações sobre esse comportamento automático, consulte Aplicar data/hora automática no Power BI Desktop.

Observação

Embora a data/hora automática seja uma opção conveniente para modelos simples, não é recomendada para cenários mais complexos e modelos maiores. Para esses modelos, é preferível criar uma mesa dedicada para maior flexibilidade.

Adicionar uma tabela de datas

Para a maioria dos modelos, é recomendável adicionar uma tabela de data (ou mais em alguns cenários). Muitos analistas de dados preferem criar suas próprias tabelas de datas, o que é bom.

Há várias maneiras de criar essa tabela, incluindo:

Qual opção é melhor para você depende de vários fatores e está além do escopo deste tutorial.

Trabalhar com cálculos baseados no tempo

Supondo que você não esteja usando data/hora automática, há duas maneiras alternativas de trabalhar com funções de inteligência de tempo no Power BI para executar cálculos baseados em tempo:

  • Inteligência de tempo clássica. A opção mais fácil e funciona muito bem para calendários gregorianos ou gregorianos deslocados, mas tem flexibilidade limitada para calendários estruturados de forma diferente ou para cálculos baseados em semanas.
  • Inteligência de tempo baseada em calendário (pré-visualização). Opção mais recente, mas requer um pouco mais de trabalho para configurar. No entanto, também lhe dá melhor desempenho, mais flexibilidade para trabalhar com calendários não gregorianos e a capacidade de realizar cálculos baseados na semana.

Observação

Você precisa definir sua tabela como uma tabela de data para cenários específicos.

Inteligência Temporal Clássica

Esta opção requer que tenha uma tabela de datas no seu modelo e que a defina em conformidade. Depois, você pode usar as funções de inteligência de tempo e consultar sua tabela de datas. Por exemplo, se você tiver uma tabela de data chamada Data em seu modelo que você definiu como sua tabela de data, que contém uma coluna Data, então você pode usar:

SAMEPERIODLASTYEAR ( 'Date'[Date] )

Embora esta seja uma abordagem rápida e fácil, há muitas desvantagens em comparação com a abordagem baseada em calendário:

  • requer que você defina a tabela de datas
  • ele só funciona com modelos que têm pelo menos uma tabela de data dedicada
  • As colunas de data usadas não devem ter datas ausentes entre a primeira e a última data. Se houver alguma data ausente entre a primeira e a última, um erro será lançado.
  • é menos flexível, pois é otimizado para calendários gregorianos ou gregorianos deslocados, como anos fiscais que começam em 1 de julho, mas que ainda seguem o calendário gregoriano
  • ele não fornece cálculos baseados em semanas
  • Em cenários específicos, os cálculos baseados no tempo não têm um bom desempenho.

Observação

Recomendamos que utilizes a abordagem baseada em calendário aprimorada.

Inteligência de tempo baseada em calendário (em pré-visualização)

Calendários são definições de metadados adicionadas a uma tabela para indicar quais colunas dessa tabela representam quais atributos de tempo. Pode definir um ou mais calendários em qualquer tabela do seu modelo. Depois de definir o calendário em seu modelo, você pode consultá-lo em suas funções de inteligência de tempo. Por exemplo, veja como calcular um ano total até a data de Vendas usando um calendário fiscal definido:

TOTALYTD ( [Sales], 'Fiscal Calendar' )

Benefícios da inteligência de tempo baseada em calendário

Os principais benefícios da inteligência de tempo baseada em calendário são:

Funciona com qualquer calendário

Os calendários oferecem total flexibilidade para decidir como dividir o tempo em anos, trimestres, meses e semanas. Você pode, por exemplo, definir os calendários que seguem estes padrões:

  • Gregorian
  • Gregoriano deslocado
  • Retalho (445, 454, 544 padrões)
  • 13-meses
  • Lunar

As possibilidades são infinitas, pois não há nenhuma suposição interna do Power BI sobre como seu calendário está estruturado. A inteligência de tempo baseada em calendário não faz suposições sobre as datas subjacentes. Todos os cálculos usam os dados subjacentes exatamente como estão.

Datas esparsas

A inteligência de tempo clássica requer que a coluna de data fornecida esteja completa - se houver alguma data ausente entre a primeira e a última data, um erro será lançado. As funções de inteligência de tempo baseadas em calendário não têm esse requisito. Em vez disso, eles operam nas datas tal como estão. Embora ainda recomendemos ter uma tabela de calendário completa e dedicada, você não é mais obrigado a tê-la. Por exemplo, se todas as suas lojas de varejo estiverem fechadas no fim de semana, você pode pular os dias do fim de semana, pois elas não têm vendas. Supondo que o seu fim de semana seja sábado e domingo, agora podes usar PREVIOUSDAY com um calendário baseado em uma tabela que não inclui entradas para o fim de semana para saltar de segunda-feira diretamente para sexta-feira.

Cálculos semanais

A inteligência de tempo baseada em calendário fornece diretamente funções DAX que operam com granularidade de uma semana. Por exemplo, os totais semanais podem ser calculados diretamente usando TOTALWTD:

TOTALWTD ( Expr, CalendarName )

Melhorias de desempenho

Alguns cenários podem apresentar um desempenho melhorado ao comparar uma função de inteligência de tempo baseada em calendário com a sua contraparte clássica. Por exemplo, um visual agrupado por semana e que realiza um cálculo desde o início do ano usando TOTALYTD ( ..., CalendarName ) deve geralmente executar-se mais rapidamente do que se a sua contraparte clássica, TOTALYTD ( ..., TableName[DateColumnName] ), fosse usada. Para saber por que isso pode acontecer, consulte a seção Compensação de contexto .

Habilite a visualização aprimorada do DAX Time Intelligence

Para começar, primeiro você precisa ativar o recurso de visualização do Enhanced DAX Time Intelligence .

  1. No Power BI Desktop, vá para Arquivo > Opções e definições > Opções > Funcionalidades de pré-visualização.
  2. Selecione a pré-visualização de Enhanced DAX Time Intelligence.
  3. Selecione OK
  4. Reiniciar o Power BI Desktop

Gerir calendários

Para gerir um calendário, clique com o botão direito do rato na tabela que contém o calendário ou na qual pretende definir o calendário e escolha Opções de calendário ou selecione Opções de calendário no friso Ferramentas de tabela depois de selecionar a tabela:

Captura de ecrã a mostrar os pontos de entrada para abrir as Opções de Calendário numa tabela.

Em alternativa, pode utilizar ferramentas externas ou a vista TMDL para definir um calendário. Para obter mais informações, consulte o script TMDL.

Os calendários também são mostrados no explorador de modelos sob a tabela na qual estão definidos:

Captura de ecrã a mostrar o explorador de modelos para um modelo semântico. O nó da tabela Data é expandido e os calendários são realçados.

A tela de opções do calendário

A tela de opções de calendário mostra os calendários definidos na tabela selecionada. Aqui você pode:

  • criar um novo calendário selecionando Novo calendário
  • editar um calendário existente selecionando Editar
  • excluir um calendário existente selecionando Excluir
  • definir a tabela como uma tabela de data selecionando Marcar como tabela de data

Captura de ecrã a mostrar as Opções de Calendário numa tabela.

Atribuir categorias de coluna

Definir um calendário envolve dar-lhe um nome e atribuir colunas a categorias. Cada categoria representa uma unidade de tempo e categorias de colunas específicas estão disponíveis. Você precisa atribuir pelo menos uma coluna primária a uma categoria para salvar seu calendário. Cada categoria deve ter uma coluna primária e pode ter zero ou mais colunas associadas. Sempre que alguma coluna associada a uma categoria estiver no contexto, o Power BI sabe qual unidade de tempo elas apresentam. Além disso, para algumas funções, como TOTALMTD o Power BI, usa a coluna primária mapeada para a categoria relevante no calendário referenciado para executar o cálculo solicitado. Para atribuir uma coluna a uma categoria, selecione a categoria no menu Adicionar categoria e, em seguida, selecione as colunas associadas primárias e opcionais.

Captura de ecrã a mostrar o ecrã de criação e edição de calendário.

Categorias de colunas disponíveis

A tabela a seguir mostra as categorias disponíveis. A tabela também dá exemplos de valores e cardinalidades para calendários gregorianos.

As categorias dividem-se em dois grupos:

  • Completo. Os dados nas colunas atribuídas às categorias Concluídas são suficientes para identificar exclusivamente o período de tempo.
  • Parcial. Os dados em colunas atribuídas a categorias parciais não são suficientes para identificar exclusivamente o período de tempo.
Categoria Description Tipo Exemplo de cardinalidade em um calendário gregoriano Exemplo de valores de coluna em um calendário gregoriano
Ano O ano Complete Y = número de anos 2024, 2025
Trimestre O trimestre incluindo o ano Complete 4*Y 1º trimestre de 2024, 2º trimestre de 2025
Trimestre do Ano O trimestre do ano Parcial 4 Ano Trimestre 1, YQ1, Q1, Trimestre 2
Mês O mês, incluindo o ano Complete 12*Y ≤ value ≤ 13*Y Janeiro 2023, 2024 fev
Mês do Ano O mês do ano Parcial 12 Janeiro, Ano Mês 11, YM11, M11, 11
Mês do trimestre O mês do trimestre Parcial 3 1, QM2
Week A semana incluindo o ano Complete 52 ≤ value ≤ 53 Semana 50 2023, W50-2023, 2023-W50
Semana do Ano A semana do ano Parcial 52 Semana 50, W50, 50
Semana do Trimestre A semana do trimestre Parcial 13 Trimestre Semana 10, QW10, 10
Semana do Mês A semana do mês Parcial 5 Semana 2 do Mês, MW2, 2
Date A data Complete 365*Y ≤ value ≤ 366*Y 12/31/2025
Dia do Ano O dia do ano Parcial 365 ≤ value ≤366 365, D1
Dia do Trimestre O dia do trimestre Parcial 92 Dia do Trimestre 10, QD2, 50
Dia do Mês O dia do mês Parcial 31 Mês Dia 30, MD10, 30
Dia da Semana O dia da semana Parcial 7 Dia da semana 5, WD5, 5

Além dessas categorias, você pode associar qualquer número de colunas em sua tabela à categoria relacionada ao tempo . Atualmente, isso não é possível nas opções de calendário, mas só pode ser feito usando ferramentas externas ou TMDL.

Observação

O contexto em todas as colunas atribuídas à categoria relacionada ao tempo é removido ao executar cálculos em todas as funções, exceto DATEADD e SAMEPERIODLASTYEAR. Qualquer contexto em colunas que fazem parte da tabela na qual o calendário está definido, mas não estão marcadas nesse calendário, é mantido.

Observação

Recomendamos que associe apenas as colunas do seu calendário que pretende utilizar nos cálculos de inteligência temporal.

Colunas primárias versus colunas associadas

A coluna primária é necessária para cada categoria. Sempre que essa coluna ou quaisquer colunas associadas atribuídas à mesma categoria no calendário referenciado estiverem no contexto ou a categoria for necessária para executar um cálculo, o Power BI usará a coluna primária. Além disso, as colunas primárias são usadas para classificação. Se os valores na coluna primária não permitirem que ela seja classificável como esperado, você poderá configurar a coluna primária para classificar por outra coluna ou usar outra coluna e tornar a coluna original uma coluna associada. Por exemplo, uma coluna com dados textuais contendo número de mês e ano em um formato de (ou seja, mm-yyyy, 01-2024, e assim por diante) não será corretamente classificada em vários anos, mas uma coluna que usa um formato 02-2024 irá:

Captura de ecrã a mostrar duas tabelas. Cada tabela tem uma coluna. A primeira tabela contém uma coluna que contém informações textuais de mês, número e ano em um formato mm-aaaa e a segunda contém as mesmas informações em um formato aaaa-mm. A coluna que contém os dados do formato mm-aaaa não está classificada corretamente.

Você pode ter zero ou mais colunas associadas atribuídas a uma categoria.

Validation

É importante validar e testar seu calendário para ter certeza de que ele atende às suas necessidades. As validações oferecidas no Power BI incluem validações em tempo real e validações offline.

Observação

Você pode salvar seu calendário apesar dos erros de validação offline, mas é recomendável resolvê-los primeiro. As falhas de validação em tempo real devem ser corrigidas para salvar.

Validações em tempo real

As validações em tempo real realizadas nos calendários são:

  • Nome exclusivo do calendário. Cada calendário tem de ter um nome exclusivo no modelo semântico.
  • Associação única por calendário. Uma coluna não pode pertencer a mais de uma categoria no mesmo calendário.
  • Singularidade do período. As categorias atribuídas devem identificar exclusivamente o período.
  • Categorização consistente. Isso garante que as colunas sejam associadas à mesma categoria nos calendários.

Singularidade do período

Sempre deve haver um caminho para identificar exclusivamente o período para as categorias atribuídas.

Sempre que você adiciona uma categoria parcial, o Power BI valida que uma combinação correspondente de categorias completas ou parciais também é marcada no mesmo calendário. Se não for esse o caso, é exibido um aviso.

Captura de tela mostrando a tela de criação e edição de calendário com um erro de validação em tempo real.

Por exemplo, ao configurar um calendário para cálculos baseados em semanas, certifique-se de atribuir pelo menos uma coluna primária a um dos seguintes conjuntos de categorias:

  • Week
  • Semana do Calendário, Ano
  • Semana do Trimestre, Trimestre do Ano
  • Semana do trimestre, Trimestre do ano, Ano
  • Semana do mês, mês do ano
  • Semana do Mês, Mês do Ano, Ano
  • Semana do Mês, Mês do Trimestre, Trimestre
  • Semana do Mês, Mês do Trimestre, Trimestre do Ano, Ano

Categorização consistente

As colunas devem ter uma categoria consistente entre calendários. Não é possível atribuir a mesma coluna a categorias diferentes, como Ano, Trimestre do Ano ou relacionadas ao tempo em calendários separados.

Validações offline

As validações offline podem ser potencialmente demoradas à medida que acedem aos dados da tabela. Portanto, eles não são executados automaticamente em contraste com as validações em tempo real. Para executar as validações, selecione Validar dados:

Captura de ecrã a mostrar o ecrã de criação e edição de calendário. O botão Validar dados é realçado.

As validações offline verificam as seguintes regras e retornam um aviso se alguma regra for invalidada no seu calendário:

  • Uma coluna associada a uma categoria não tem valores em branco.
  • As categorias de nível superior e nível inferior têm uma relação de cardinalidade um-para-muitos. Por exemplo, as colunas associadas à categoria Ano devem ter uma cardinalidade de um-para-muitos com as colunas associadas à categoria Mês.
  • As colunas que estão associadas com categorias no mesmo nível têm uma relação de cardinalidade de um-para-um. Por exemplo, as colunas associadas à categoria Mês devem ter uma cardinalidade um-para-um com as combinações das colunas associadas às categorias Mês de Ano e Ano.
  • As colunas primárias e associadas atribuídas à mesma categoria têm uma razão de cardinalidade um-para-um. Por exemplo, quando atribuído à categoria Mês, uma coluna primária chamada Mês e uma coluna associada chamada NomeInglêsDoMês devem ter uma cardinalidade um-para-um.

Trabalhar com calendários

Uma vez definido um calendário, você pode consultá-lo em Funções de inteligência de tempo. Por exemplo, a medida a seguir calcula um valor total mensal até a data da Quantidade Total em relação ao calendário ISO-454 :

Total Quantity MTD ISO-454 = TOTALMTD ( [Total Quantity], 'ISO-454' )

Se o calendário não estiver definido e o erro for retornado:

Captura de tela mostrando uma medida usando a TOTALMTD função com um parâmetro de calendário para um calendário inexistente.

No entanto, mesmo que o calendário esteja definido, uma medida ainda pode retornar um erro. Isso acontece se a função usada espera que uma categoria esteja presente no calendário e o calendário não tem essa categoria. Por exemplo, TOTALWTD espera que categorias específicas estejam presentes no calendário. Se não estiverem, um erro será retornado:

Captura de tela mostrando uma medida usando a TOTALWTD função com uma referência de calendário válida que não define as categorias necessárias.

Funções de inteligência temporal e categorias necessárias

Muitas funções de inteligência de tempo exigem categorias suficientes para serem incluídas no calendário referenciado na chamada de função para que o Power BI possa identificar uma unidade de tempo específica exclusiva. Em outras palavras, o Power BI precisa ter a capacidade de "escalar" do nível em que o cálculo é realizado até chegar a um ano específico. Por exemplo, ao realizar um cálculo em trimestres, por exemplo, usando TOTALQTD, atribuir a categoria Trimestre ou atribuir ambas as categorias Trimestre do Ano e Ano no calendário, conforme determinado pela validação de exclusividade de período.

Observação

Para algumas funções, seu nome é indicativo de qual nível o cálculo opera (por exemplo, TOTALYTD), enquanto para outras depende dos parâmetros e do contexto (por exemplo, DATEADD).

Limpeza de contexto

As funções de inteligência de tempo operam começando em um ponto no tempo e, em seguida, executando alguma operação nele, a fim de produzir um ponto diferente no tempo. Naturalmente, o ponto inicial no tempo pode entrar em conflito com esse resultado, causando assim uma interseção de contexto de filtro que, por padrão, produziria resultados parciais ou vazios. Por exemplo, considere o seguinte cenário.

Definição de calendário

Temos um calendário gregoriano simples que marca três categorias, definidas como:

Categoria Coluna primária
Ano Ano
Mês do Ano Mês do Ano
Trimestre Trimestre

Definições de medidas

São definidas duas medidas básicas: uma para calcular as vendas totais e outra para calcular as vendas totais do trimestre anterior:

[TotalSales] = CALCULATE ( SUM( FactInternetSales[SalesAmount] ) )
[LastQuarterSales] = CALCULATE ( [TotalSales], DATEADD( GregorianCalendar, -1, QUARTER ) )

Exemplo: Como funciona a limpeza de contexto

A nossa tabela apura a granularidade mensal utilizando as colunas Year e MonthOfYear.

Ano Mês do Ano Vendas totais Vendas do último trimestre
2011 1 10
2011 2 20
2011 3 30
2011 4 40 10
2011 5 50 20

Nesta tabela, a linha em negrito é apresentada a nível mensal, para o mês de abril de 2011. Assim, todas as medidas nesta linha serão avaliadas sob o contexto de filtro de [Ano] == 2011 e [MêsdeAno] == 4.
Como esperado, o TotalSales aqui é calculado como o total de vendas de abril de 2011.

LastQuarterSales também calcula TotalSales, mas recebe um filtro extra fornecido pela DATEADD função baseada em calendário. Para esta linha, DATEADD teria um ponto de partida inicial no tempo em abril de 2011, e determinaria o momento que é exatamente um trimestre antes: janeiro de 2011. Como resultado, pode-se esperar que esse TotalSales seja calculado nos dois contextos de filtro a seguir:

  • Fornecido pelas colunas de navegação da linha atual: { [Year] == 2011, [MonthOfYear] == 4 } (Equivalentemente, abril de 2011)
  • Fornecido pelo DATEADD filtro: { [Year] == 2011, [MonthOfYear] == 1 } (Equivalentemente, janeiro 2011)

Claramente, esses dois contextos de filtro entrariam em conflito - não podemos avaliar as vendas totais considerando o mês atual como janeiro de 2011 e abril de 2011. Tal intersecção não produziria resultados. No entanto, não é isso que ocorre. Em vez disso, com base na definição de calendário, as funções de inteligência de tempo baseadas em calendário identificam quais colunas de categorias podem resultar em conflitos, seguindo a operação de tempo que a função executa. Neste caso, DATEADD realiza um deslocamento ao nível do Trimestre. A função identifica que as categorias Ano e Mês do Ano podem mudar como resultado de uma alteração nas colunas da categoria Trimestre . Assim, a função limpa o contexto do filtro em todas as colunas (primárias e associadas) marcadas para essas categorias.

Em outras palavras, podemos dizer que as categorias Ano e Mês do Ano são dependências da categoria Trimestre . Por outro lado, podemos dizer que a categoria Trimestre é dependente das categorias Ano e Mês do Ano .

Como funciona a limpeza de contexto

Diagrama de estrutura reticulada de todas as categorias de calendário.

Este diagrama é fornecido para visualizar melhor as dependências entre as diferentes categorias de tempo. Cada categoria nesta rede representa todas as colunas (primárias e associadas) marcadas para essa categoria. As categorias são conectadas às suas dependências por meio de setas. Por exemplo, "Mês" depende de "Ano", "Trimestre do Ano", "Mês do Trimestre", "Trimestre" e "Mês do Ano".

Quando o contexto é definido numa coluna ou na sua associada ordenar por coluna que está marcada num calendário, o contexto de filtro anterior é removido em:

  1. Todas as dependências de categoria de X. Isto pode ser entendido como todas as categorias superiores a X.
  2. Todas as categorias dependentes de X e suas dependências (isto é, de 1. acima). Isto pode ser pensado como todas as categorias abaixo de X e todas as categorias em 1 acima.

Observação

A limpeza de contexto acontece em colunas marcadas em um calendário ou colunas de classificação associadas , independentemente de o contexto ser definido usando funções de inteligência de tempo ou de outra forma.

A maioria das funções de inteligência de tempo, exceto para DATEADD e SAMEPERIODLASTYEAR, limpará o contexto em todas as colunas relacionadas ao tempo e colunas de classificação por associadas.

Comportamento entre calendários

Se houver vários calendários definidos na mesma tabela, esses processos serão concluídos para cada calendário definido na tabela. Isso inclui a observação sobre a limpeza de contexto de colunas relacionadas ao tempo. Em outras palavras, suponha que uma tabela define três calendários: Calendar1, Calendar2 e Calendar3. Se o contexto do filtro estiver definido na categoria "X" no Calendário1, os processos acima serão executados nos três calendários.

Exemplo: Filtro definido em "Trimestre"

Se o contexto do filtro fosse definido na categoria "Trimestre", o processo seria o seguinte.

  1. Em primeiro lugar, todas as dependências da categoria "Trimestre" seriam consideradas.

    Exemplo de comportamento de limpeza de contexto do filtro começando pela categoria Trimestre: Dependências.

  2. Em seguida, seriam analisados todos os dependentes de "Quarter" e suas dependências.

    Exemplo de comportamento de limpeza de contexto de filtro a partir da categoria Trimestre: Dependentes.

  3. Finalmente, o resultado final seria o seguinte. Todas as categorias de cor vermelha teriam seu contexto de filtro anterior removido e o novo contexto seria definido em Trimestre.

    Exemplo de comportamento de limpeza de contexto de filtro a partir da categoria Trimestre: Resultados

Script TMDL para calendários

createOrReplace

	table Date
		lineageTag: xyz

		column Date
			dataType: dateTime
			formatString: Long Date
			lineageTag: abc
			summarizeBy: none
			sourceColumn: Date

        column Year
			dataType: string
			lineageTag: abc
			summarizeBy: none
			sourceColumn: Year

			annotation SummarizationSetBy = Automatic
        
        column Month
			dataType: string
			lineageTag: def
			summarizeBy: none
			sourceColumn: Month

			annotation SummarizationSetBy = Automatic

        column MonthName
			dataType: string
			lineageTag: ghi
			summarizeBy: none
			sourceColumn: MonthName
			sortByColumn: SortByMonth

			changedProperty = SortByColumn

			annotation SummarizationSetBy = Automatic

        column DutchMonthName
			dataType: string
			lineageTag: jkl
			summarizeBy: none
			sourceColumn: DutchMonthName

			annotation SummarizationSetBy = Automatic

        column 'Holiday Name'
			dataType: string
			lineageTag: mno
			summarizeBy: none
			sourceColumn: Holiday Name

			annotation SummarizationSetBy = Automatic
        
        column IsWorkingDay
			dataType: string
			lineageTag: pqr
			summarizeBy: none
			sourceColumn: IsWorkingDay

			annotation SummarizationSetBy = Automatic
		...	
		
		calendar 'Demo Calendar'
			lineageTag: def

			calendarColumnGroup = year
				primaryColumn: Year

			calendarColumnGroup = month
				primaryColumn: Month
				associatedColumn: DutchMonthName
				associatedColumn: MonthName
			
			calendarColumnGroup
                column: 'Holiday Name'
                column: isWorkingDay

Observação

Observe que, se você não especificar nenhuma categoria para o calendarColumnGroup TMDL, as colunas serão marcadas como relacionadas ao tempo. Neste exemplo, Holiday Name e isWorkingDay são colunas relacionadas ao tempo no Calendário de Demonstração.

Juntando tudo: Exemplos de mudança de tempo

Algumas funções de inteligência de tempo mudam o contexto apenas lateralmente, considerando todas as colunas, enquanto outras executam mudanças hierárquicas — mantendo ou limpando o contexto com base no fato de as colunas estarem marcadas no calendário. As funções de inteligência de tempo podem ser divididas em dois grupos com base em se permitem mudanças hierárquicas:

  • Corrigido. As funções neste grupo são DATEADD e SAMEPERIODLASTYEAR. Essas funções permitem apenas deslocamentos laterais de tempo e não retornam valores de um nível diferente de detalhe.
  • Flexível. Este grupo contém todas as outras funções de inteligência temporal. Essas funções permitem mudanças hierárquicas de tempo e, dependendo da configuração do calendário, podem retornar resultados de um nível diferente de detalhes.

Para mostrar esses comportamentos, vamos percorrer um exemplo usando um modelo de dados simples que consiste em duas tabelas, dois calendários e cinco medidas.

Tabelas e relações

Para este exemplo, temos o seguinte modelo de dados simples:

Table Columns
Date Ano, IsWorkingDay, Data
Sales OrderKey, Quantidade, Data de Encomenda

Aqui estão alguns exemplos de linhas na tabela Data : Captura de tela mostrando as primeiras 14 linhas da tabela Data de exemplo. A tabela define Data, Ano e IsWorkingDay. A coluna Data contém uma data, a coluna Ano o valor do ano e a coluna IsWorkingDay é uma coluna booleana (Verdadeiro/Falso) que indica se a data é um dia útil ou não.

Aqui estão algumas linhas de exemplo na tabela Sales : Captura de tela mostrando as primeiras nove linhas da tabela Sales de exemplo. A tabela define OrderKey, OrderDate e Order Quantity. A coluna OrderKey contém um número exclusivo para cada ordem de venda, a OrderDate é uma data que relaciona Sales to Date e a Order Quantity é uma coluna numérica que representa o número de produtos para cada ordem.

As tabelas Sales e Date estão relacionadas em OrderDate e Date.

Captura de ecrã que mostra a vista do modelo para o modelo de exemplo. Mostra a tabela Sales e a tabela Date, e uma relação um-para-muitos entre elas nos campos OrderDate e Date.

Calendários

Na tabela Data , definimos calendários com estes mapeamentos:

Nome do Calendário Categoria Coluna primária
Gregoriano Ano Ano
Date Date
GregorianComDia de Trabalho Ano Ano
Date Date
Relacionados com o tempo IsWorkingDay

A definição TMDL equivalente destes dois calendários é:

ref table Date
    calendar 'Gregorian'
        lineageTag: xyz
    
        calendarColumnGroup = year
    	    primaryColumn: Year
    
    	calendarColumnGroup = date
    		primaryColumn: Date
    
    calendar 'GregorianWithWorkingDay'
    	lineageTag: dc4fc383-1661-4112-8afb-930d324fbb6e
    
    	calendarColumnGroup = year
    		primaryColumn: Year
    
    	calendarColumnGroup = date
    		primaryColumn: Date
    
    	calendarColumnGroup
    		column: IsWorkingDay   

Medições

Na mesa Vendas , definimos as seguintes medidas:

Total Quantity = SUM ( 'Sales'[Order Quantity] )

OneYearAgoQuantity =
CALCULATE ( [Total Quantity], DATEADD ( 'Gregorian', -1, YEAR ) )

OneYearAgoQuantityTimeRelated =
CALCULATE ( [Total Quantity], DATEADD ( 'GregorianWithWorkingDay', -1, YEAR ) )

FullLastYearQuantity =
CALCULATE ( [Total Quantity], PARALLELPERIOD ( 'Gregorian', -1, YEAR ) )

FullLastYearQuantityTimeRelated =
CALCULATE ( [Total Quantity], PARALLELPERIOD ( 'GregorianWithWorkingDay', -1, YEAR )
)

Exemplo de deslocamento lateral

Vamos criar um visual que mostre Year, MonthOfYear, IsWorkingDay, Total Quantity, OneYearAgoQuantity e OneYearAgoQuantityTimeRelated para 2024 e 2025:

Captura de tela mostrando um visual de tabela que mostra Year, IsWorkingDay, Total Quantity, OneYearAgoQuantity e OneYearAgoQuantityTimeRelated. Os valores de OneYearAgoQuantity e OneYearAgoQuantityTimeRelated para 2025 correspondem aos valores de 2024 para os mesmos valores de IsWorkingDay.

Todos os valores de OneYearAgoQuantity e OneYearAgoQuantityTimeRelated para 2025 correspondem à Quantidade Total de exatamente um ano antes (2024), para o mesmo valor IsWorkingDay .

Isso mostra que DATEADD mantém o contexto em qualquer coluna na tabela Data que contém o calendário usado, independentemente de ele não estar marcado ou se estiver marcado como relacionado à hora nesse calendário. Como em nossas definições de medida instruímos DATEADD a retroceder em um ano, a única coluna cujo contexto foi deslocado foi a coluna associada à categoria Ano. Se a coluna IsWorkingDay foi marcada no calendário como relacionada ao tempo ou não marcada, isso não alterou o resultado. A única outra função que exibe esse comportamento é SAMEPERIODLASTYEAR.

Exemplo de deslocamento hierárquico

Agora, vamos ver um exemplo em que se uma coluna é marcada como relacionada ao tempo ou não realmente muda o resultado.

Para isso, vamos recriar o mesmo visual do exemplo anterior, mas desta vez vamos usar as medidas FullLastYearQuantity e FullLastYearQuantityTimeRelated: Captura de tela mostrando um visual de tabela que mostra Year, IsWorkingDay, Total Quantity, FullLastYearQuantity e FullLastYearQuantityTimeRelated. Os valores de FullLastYearQuantity 2025 correspondem aos valores de 2024 para os mesmos valores de IsWorkingDay, mas os valores de FullLastYearQuantityTimeRelated são iguais ao valor da quantidade total, independentemente dos valores de IsWorkingDay.

Isso mostra que PARALLELPERIOD preserva o contexto para colunas não marcadas no calendário, mas limpa o contexto para aquelas marcadas como relacionadas ao tempo. FullLastYearQuantity usou o calendário gregoriano onde IsWorkingDay não foi marcado no calendário, enquanto FullLastYearQuantityTimeRelated usou o calendário GregorianWithWorkingDay onde IsWorkingDay foi marcado como relacionado ao tempo. Todas as funções de inteligência de tempo, exceto DATEADD e SAMEPERIODLASTYEAR, funcionam desta forma.

Bônus: Se você realmente queria forçar essas funções para preservar o contexto para colunas relacionadas ao tempo também, você pode usar VALUES:

FullLastYearQuantityTimeRelatedOverride =
CALCULATE ( [Total Quantity], PARALLELPERIOD ( 'GregorianWithWorkingDay', -1, YEAR ), VALUES('Date'[IsWorkingDay]) )

Nesse caso, FullLastYearQuantityTimeRelatedOverride retorna os mesmos resultados que FullLastYearQuantity.

Conclusion

O exemplo elaborado acima mostra que diferentes funções de inteligência de tempo se comportam de forma diferente, dependendo se as colunas são marcadas como relacionadas ao tempo no calendário. DATEADD e SAMEPERIODLASTYEAR apenas executam deslocamentos laterais no tempo. Todas as outras funções de inteligência de tempo permitem mudanças hierárquicas no tempo.

Utilizar DATEADD com calendários

A função DATEADD tem parâmetros específicos que permitem um controle refinado sobre como os deslocamentos são executados quando a seleção está em um nível mais granular do que o nível de deslocamento indicado pelo parâmetro interval em DATEADD. Isso acontece, por exemplo, se estiveres a mostrar dados ao nível da data, mas definires o interval parâmetro para DATEADDMONTH. Por exemplo, em um calendário gregoriano, ao mudar um período que se estende de 3 a 10 de março por um mês resultará em 3 a 10 de abril. No entanto, como os meses nos calendários gregorianos variam em comprimento, isso pode levar a ambiguidades ao mudar. Abaixo estão exemplos de cenários baseados em um calendário gregoriano:

Mudança de um período mais curto para um período mais longo

Por exemplo, adiantar um mês com uma seleção em fevereiro, então o mês alvo é março. Você pode usar o extension parâmetro para influenciar como o turno é executado:

Valor do parâmetro de extensão Description Result
precise Isso mantém rigorosamente o intervalo de datas original. Os dias 25 e 28 de fevereiro são transferidos para 25 e 28 de março.
extended Permite que a janela se expanda até ao final do mês. As datas de 25 a 28 de fevereiro foram adiadas para 25 a 31 de março.

Mudança de um período mais longo para um período mais curto

Por exemplo, deslocar um mês para trás partindo de uma seleção em março, de modo que o mês alvo seja fevereiro.

Você pode usar o truncation parâmetro para influenciar como o turno é executado:

Valor do parâmetro de truncamento Description Result
anchored Ancora o resultado à última data válida do mês menor. 31 de março é transferido para 28 de fevereiro (ou 29 no ano bissexto).
blank Quando uma data alterada não existir, retorne em branco. Retroceder um mês a partir de 31 de março retorna em branco (uma vez que 31 de fevereiro não existe).

Considerações para trabalhar com inteligência de tempo baseada em calendário

  • Executar um cálculo de inteligência de tempo em uma tabela de fatos que define um calendário e está sujeita a regras de segurança em nível de linha (RLS) e pode levar a resultados inesperados.
  • O desempenho deste recurso de visualização não é representativo do produto final.
  • Ainda não é possível criar calendários no Serviço do Power BI.
  • Não deve utilizar tabelas de data/hora automáticas com calendários personalizados.
  • Não é possível usar calendários com modelos conectados ao vivo ou compostos.
  • Recomendamos que associe apenas as colunas do seu calendário que pretende utilizar nos cálculos de inteligência temporal.
  • Os calendários estão sujeitos a validações em tempo real e offline . Você pode salvar seu calendário apesar dos erros de validação offline, mas é recomendável resolvê-los primeiro. As falhas de validação em tempo real devem ser corrigidas para salvar.
  • Cada calendário deve ter um nome exclusivo dentro do modelo de dados
  • Uma única tabela pode conter vários calendários
  • A tabela que contém o calendário deve ter menos de 200 colunas. Se a tabela contiver mais de 20.000 linhas, as validações não estarão disponíveis, mas você ainda poderá adicionar um calendário.
  • Um calendário deve atribuir pelo menos uma coluna primária a uma categoria
  • Um calendário só pode atribuir colunas da sua própria tabela a categorias
  • Cada categoria deve ter uma coluna primária e pode ter zero ou mais colunas associadas atribuídas
  • DATEADD tem novos parâmetros para controlar o comportamento de extensão e extensão, que não são reconhecidos no IntelliSense.
  • Qualquer coluna pode ser mapeada para apenas uma categoria
  • Não se podem aninhar funções de inteligência temporal que utilizam calendários. Por exemplo, a seguinte instrução DAX não é suportada:
ThisIsNotSupported = PREVIOUSDAY ( PREVIOUSMONTH( 'Calendar' ) )

Em vez disso, você pode fazer:

ThisWorks = CALCULATETABLE ( PREVIOUSDAY ( 'Calendar' ), PREVIOUSMONTH( 'Calendar' ) )

Criar uma tabela de datas usando ferramentas internas

Os exemplos a seguir criam uma tabela de data de 1º de janeiro de 2010 a 31 de dezembro de 2030 usando o Power Query M ou o DAX. Inclui as seguintes colunas: Ano, Número do Mês, Nome do Mês, Ano do Mês, Trimestre, Trimestre do Ano, Dia e Data.

Power Query M

let
    StartDate = #date(2010, 1, 1),
    EndDate = #date(2030, 12, 31),
    NumberOfDays = Duration.Days(EndDate - StartDate) + 1,
    DateList = List.Dates(StartDate, NumberOfDays, #duration(1,0,0,0)),
    DateTable = Table.FromList(DateList, Splitter.SplitByNothing(), {"Date"}),
    AddYear = Table.AddColumn(DateTable, "Year", each Date.Year([Date]), Int64.Type),
    AddMonthNumber = Table.AddColumn(AddYear, "Month Number", each Date.Month([Date]), Int64.Type),
    AddMonthName = Table.AddColumn(AddMonthNumber, "Month Name", each Date.ToText([Date], "MMMM"), type text),
    AddMonthYear = Table.AddColumn(AddMonthName, "Month Year", each Date.ToText([Date], "MMM yyyy"), type text),
    AddQuarter = Table.AddColumn(AddMonthYear, "Quarter", each "Q" & Text.From(Date.QuarterOfYear([Date])), type text),
    AddYearQuarter = Table.AddColumn(AddQuarter, "Year Quarter", each Text.From(Date.Year([Date])) & " Q" & Text.From(Date.QuarterOfYear([Date])), type text),
    AddDay = Table.AddColumn(AddYearQuarter, "Day", each Date.Day([Date]), Int64.Type)
in
    AddDay

DAX

DateTable =
ADDCOLUMNS (
    CALENDAR ( DATE ( 2010, 1, 1 ), DATE ( 2030, 12, 31 ) ),
    "Year", YEAR ( [Date] ),
    "Month Number", MONTH ( [Date] ),
    "Month Name", FORMAT ( [Date], "MMMM" ),
    "Month Year", FORMAT ( [Date], "MMM YYYY" ),
    "Quarter", "Q" & FORMAT ( [Date], "Q" ),
    "Year Quarter",
        FORMAT ( [Date], "YYYY" ) & " Q"
            & FORMAT ( [Date], "Q" ),
    "Day", DAY ( [Date] ),
    "Date", [Date]
)

Para obter mais informações e mais opções, consulte Tabelas de data.

Para obter mais informações relacionadas a este artigo, consulte os seguintes recursos: