Compartilhar via


Implementar cálculos baseados em tempo no Power BI

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

É recomendável usar a inteligência de tempo baseada em calendário (versão prévia) porque ela fornece o melhor desempenho e a maior variedade de flexibilidade para atender a qualquer calendário.

Esta tabela compara as três ferramentas fornecidas:

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

Observação

Aconselhamos não usar técnicas alternativas de inteligência de tempo, particularmente aquelas que envolvem a adição de colunas extras a tabelas de data para calcular deslocamentos, exceto para casos de uso específicos. Embora essas abordagens possam atrair iniciantes devido às fórmulas DAX simples, elas tendem a inflar modelos semânticos desnecessariamente. Esse inchaço pode levar a atualizações de dados mais lentas e à diminuição do desempenho do relatório conforme 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 é recomendável para cenários mais complexos e modelos maiores. Para esses modelos, é preferível criar uma tabela dedicada para obter mais flexibilidade.

Adicionar uma tabela de datas

Para a maioria dos modelos, é recomendável adicionar uma tabela de datas (ou mais em alguns cenários). Muitos analistas de dados preferem criar suas próprias tabelas de data, 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 temporais

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 bem para calendários gregorianos ou 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 (versão prévia). Opção mais recente, mas requer um pouco mais de trabalho para configurar. No entanto, ele também oferece melhor desempenho, mais flexibilidade para trabalhar com calendários não gregorianos e a capacidade de executar cálculos baseados em semana.

Observação

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

Inteligência de tempo clássica

Essa opção exige que você tenha uma tabela de datas em seu modelo e defina-a adequadamente. Posteriormente, você pode usar as funções de inteligência temporal e fazer referência à tabela de datas. Por exemplo, se você tiver uma tabela de datas chamada Date em seu modelo que você definiu como sua tabela de datas, que contém uma coluna Data, você poderá usar:

SAMEPERIODLASTYEAR ( 'Date'[Date] )

Embora essa 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 as primeiras e as últimas datas. Se houver datas ausentes entre as primeiras e as últimas datas, um erro será gerado.
  • é menos flexível, pois é otimizado para calendários gregorianos ou deslocados, como anos fiscais que iniciam em 1º de julho, mas ainda seguem um calendário gregoriano
  • ele não fornece cálculos baseados em semana
  • em cenários específicos, os cálculos baseados em tempo não têm um bom desempenho.

Observação

Recomendamos que você use a abordagem baseada em calendário aprimorada.

Inteligência de tempo baseada em calendário (versão prévia)

Calendários são definições de metadados adicionadas a uma tabela para indicar quais colunas dessa tabela representam quais atributos de tempo. Você pode definir um ou mais calendários em qualquer tabela em seu modelo. Depois de definir o calendário em seu modelo, você pode fazer referência a ele 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 flexibilidade total 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 ajustado
  • Varejo (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 é 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 originais exatamente como estão.

Datas esparsas

A inteligência de hora clássica requer que a coluna de data fornecida seja concluída– se houver datas ausentes entre as primeiras e as últimas datas, um erro será gerado. 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 como estão. Embora ainda seja recomendável ter uma tabela de calendário completa e dedicada, você não precisa mais ter isso. Por exemplo, se todas as suas lojas de varejo estiverem fechadas durante o fim de semana, você poderá ignorar os dias de fim de semana, pois elas não têm vendas. Supondo que o seu fim de semana seja sábado e domingo, agora você pode usar PREVIOUSDAY com um calendário baseado em uma tabela que não possui entradas para o fim de semana, permitindo assim pular da segunda-feira diretamente para a sexta-feira.

Cálculos baseados em semana

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

TOTALWTD ( Expr, CalendarName )

Aprimoramentos de desempenho

Alguns cenários podem apresentar melhor desempenho ao comparar uma função de inteligência de tempo baseada em calendário com seu equivalente clássico. Por exemplo, um visual que é agrupado pela semana e executa um cálculo de ano a ano usando TOTALYTD ( ..., CalendarName ) geralmente deve ser executado mais rapidamente do que se seu equivalente clássico, TOTALYTD ( ..., TableName[DateColumnName] )fosse usado. Para obter informações sobre por que isso pode acontecer, consulte a seção Desmarcação de contexto .

Habilitar a visualização aprimorada do DAX Time Intelligence

Para começar, primeiro você precisa habilitar o recurso avançado de visualização do DAX Time Intelligence .

  1. No Power BI Desktop, acesse Arquivo > Opções e configurações > Opções > Recursos de visualização.
  2. Selecione a visualização Avançada do DAX Time Intelligence.
  3. Selecione OK
  4. Reiniciar o Power BI Desktop

Gerenciar calendários

Para gerenciar um calendário, clique com o botão direito do mouse na tabela que contém o calendário ou no qual você deseja definir o calendário e escolha as opções calendário ou selecione opções calendário na faixa de opções ferramentas tabela depois de selecionar a tabela:

Captura de tela mostrando os pontos de entrada para abrir as Opções de Calendário em uma tabela.

Como alternativa, você pode usar ferramentas externas ou a exibição TMDL para definir um calendário. Para obter mais informações, consulte o script TMDL.

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

Captura de tela mostrando o gerenciador 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 de calendário

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

  • 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 tela mostrando as Opções de Calendário em uma 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 coluna específicas estão disponíveis. Você precisa, pelo menos, atribuir 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 as colunas associadas a uma categoria estiverem no contexto, o Power BI saberá 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 tela mostrando a criação e a tela de edição do calendário.

Categorias de coluna disponíveis

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

As categorias são divididas em dois grupos:

  • Concluído. Dados em colunas atribuídas a categorias Completas são suficientes para identificar exclusivamente o período de tempo.
  • Parcial. 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 Valores de coluna de exemplo em um calendário gregoriano
Ano O ano Concluir Y = número de anos 2024, 2025
Trimestre O trimestre incluindo o ano Concluir 4*Y 1º trimestre de 2024, 2º trimestre de 2025
Trimestre do ano O trimestre do ano Parcial 4 1º Trimestre do Ano, YQ1, 1º Trimestre, 2º Trimestre
Mês O mês incluindo o ano Concluir 12*Y ≤ value ≤ 13*Y Janeiro de 2023, fevereiro de 2024
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 Concluir 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 Concluir 365*Y ≤ value ≤ 366*Y 31/12/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 Dia 30 do mês, MD10, 30
Dia da Semana O dia da semana Parcial 7 Semana 5, WD5, 5

Além dessas categorias, você pode associar qualquer número de colunas em sua tabela à categoria relacionada ao tempo . No momento, isso não é possível nas opções de calendário, mas pode ser feito apenas 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 .SAMEPERIODLASTYEAR Qualquer contexto em colunas que fazem parte da tabela na qual o calendário é definido, mas não estão etiquetadas nesse calendário, é mantido.

Observação

Recomendamos que você associe apenas as colunas em seu calendário que deseja usar em cálculos de análise temporal.

Colunas primárias versus associadas

A coluna primária é necessária para cada categoria. Sempre que essa coluna ou qualquer coluna associada atribuída à mesma categoria no calendário referenciado estiver 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 classificada conforme o 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 que contêm o número do mês e o ano em um formato de mm-yyyy (ou seja, 01-2024e 02-2024assim por diante) não será classificada corretamente ao longo de vários anos, mas uma coluna que usa o yyyy-mm formato será:

Captura de tela mostrando duas tabelas. Cada tabela tem uma coluna. A primeira tabela contém uma coluna que contém informações de ano e número de mês textual em um formato mm-yyyyy e a segunda contém as mesmas informações em um formato yyy-mm. A coluna que contém os dados de formato mm-yyyyy não é classificada corretamente.

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

Validation

É importante validar e testar seu calendário para que você tenha 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 resolvê-los primeiro é recomendável. As falhas de validação em tempo real devem ser corrigidas para que seja possível salvar.

Validações em tempo real

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

  • Nome do calendário exclusivo. Cada calendário precisa 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.
  • Exclusividade do período. As categorias atribuídas devem identificar exclusivamente o período.
  • Categorização consistente. Isso garante que as colunas estejam associadas à mesma categoria entre calendários.

Unicidade 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 esse não for o caso, um aviso será mostrado.

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

Por exemplo, ao configurar um calendário para cálculos baseados em semana, atribua pelo menos uma coluna primária a um dos seguintes conjuntos de categorias:

  • Week
  • Semana do ano, Ano
  • Semana do Trimestre, Trimestre
  • Semana do trimestre, Trimestre do ano, Ano
  • Semana do Mês, Mês
  • 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. Você não pode 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 demoradas à medida que acessam os 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 tela mostrando a criação e a tela de edição do calendário. O botão Validar dados está realçado.

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

  • uma coluna associada a uma categoria não tem valores em branco.
  • categorias de nível superior e de nível inferior têm uma relação de cardinalidade de um para muitos. Por exemplo, as colunas associadas à categoria Ano devem ter uma cardinalidade um-para-muitos com colunas associadas à categoria Mês.
  • colunas associadas a categorias no mesmo nível têm uma relação de cardinalidade 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 relação de cardinalidade um-para-um. Por exemplo, quando atribuído à categoria Mês, uma coluna primária Month e uma coluna associada EnglishMonthName devem ter uma cardinalidade de um para um.

Trabalhar com calendários

Depois que um calendário é definido, você pode fazer referência a ele em funções de inteligência de tempo. Por exemplo, a medida a seguir calcula um valor total acumulado do mês 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.

Mesmo que o calendário seja definido, no entanto, uma medida ainda poderá 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 tenha 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 exclusivamente específica. Em outras palavras, o Power BI precisa ser capaz de "subir" do nível em que o cálculo é executado até um ano individual. Por exemplo, ao executar um cálculo em trimestres, usando TOTALQTD, atribua a categoria Trimestre ou atribua ambas as categorias Trimestre do Ano e Ano no calendário, conforme ditado pela validação de unicidade de período.

Observação

Para algumas funções, seu nome é um indicativo de qual nível o cálculo opera (por exemplo), TOTALYTDenquanto para outras depende dos parâmetros e 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 nela, a fim de produzir um ponto diferente no tempo. Naturalmente, o ponto inicial no tempo pode entrar em conflito com esse resultado, causando uma interseção de contexto de filtro que, por padrão, produziria resultados parciais ou vazios. Por exemplo, leve em consideração 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êsDoAno
Trimestre Trimestre

Definições de medida

Duas medidas básicas são definidas: uma para calcular o total de vendas e outra para calcular o total de vendas do trimestre anterior:

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

Exemplo: como funciona a limpeza de contexto

Nosso visual de tabela navega com uma granularidade mensal usando as colunas Year e MonthOfYear

Ano MêsDoAno VendasTotais LastQuarterSales
2011 1 10
2011 2 20
2011 3 30
2011 4 40 10
2011 5 50 20

Nesta tabela, a linha em negrito representa dados no nível de mês, especificamente para abril de 2011. Portanto, todas as medidas nessa linha serão avaliadas no contexto de filtro de [Ano] == 2011 e [MonthOfYear] == 4.
Como esperado, o TotalSales aqui é computado como o total de vendas de abril de 2011.

LastQuarterSales calcula TotalSales de forma semelhante, mas com um filtro extra fornecido pela função baseada em DATEADD calendário. Para esta linha, DATEADD teria um ponto inicial no tempo em abril de 2011 e resultaria no momento que é exatamente um trimestre antes: janeiro de 2011. Como resultado, pode-se esperar que esse TotalSales seja computado 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 de 2011)

Claramente, esses dois contextos de filtro entrariam em conflito - não podemos avaliar o total de vendas considerando o mês atual simultaneamente como janeiro de 2011 e abril de 2011. Tal interseção não produziria resultados. No entanto, isso não é o 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 executada pela função. Nesse caso, DATEADD executa uma mudança no nível Trimestre. A função identifica que as categorias Ano e Mês do Ano podem ser alteradas como resultado de uma alteração nas colunas da categoria Trimestre . Assim, a função limpa o contexto de 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 de treliça de todas as categorias de calendário.

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

Quando o contexto é definido em uma coluna ou na sua coluna de classificação associada marcada em um calendário, o contexto de filtro anterior é limpo em:

  1. Todas as dependências de categoria relacionadas a X. Isso pode ser entendido como todas as categorias acima de X.
  2. Todos os dependentes da categoria tanto de X quanto de suas dependências (ou seja, de 1. acima). Isso pode ser considerado como todas as categorias abaixo de X e todas as categorias em 1 acima.

Observação

A limpeza de contexto ocorre 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 DATEADD e SAMEPERIODLASTYEAR, limpará o contexto em todas as colunas relacionadas ao tempo e nas colunas associadas de classificação.

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 defina três calendários: Calendar1, Calendar2 e Calendar3. Se o contexto de filtro for definido na categoria "X" no Calendar1, 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. Primeiro, todas as dependências da categoria "Quarter" seriam consideradas.

    Exemplo de comportamento de limpeza de contexto de filtro a partir da categoria Quarter: Dependências.

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

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

  3. Por fim, o resultado final seria o seguinte. Todas as categorias de cor vermelha teriam seu contexto de filtro anterior removido e o novo contexto é 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, Nome do Feriado e isWorkingDay são colunas relacionadas ao tempo no Calendário de Demonstração.

Juntar tudo: exemplos de mudança de tempo

Algumas funções de inteligência de tempo alteram o contexto apenas lateralmente, considerando todas as colunas, enquanto outras realizam alterações hierárquicas, mantendo ou limpando o contexto dependendo de se as colunas são 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 só permitem turnos de tempo laterais e não retornam valores de um nível diferente de detalhes.
  • Flexível. Esse grupo contém todas as outras funções de análise temporal. Essas funções permitem turnos de tempo hierárquicos 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, DiaÚtil, Data
Sales OrderKey, Quantidade, Data do Pedido

Aqui estão alguns exemplos de linhas na tabela Data : captura de tela mostrando as primeiras 14 linhas da tabela Date 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 booliana (True/False) que indica se a data é um dia útil ou não.

Aqui estão algumas linhas de exemplo na tabela Vendas : captura de tela mostrando as nove primeiras linhas da tabela De vendas de exemplo. A tabela define OrderKey, OrderDate e Order Quantity. A coluna OrderKey contém um número exclusivo para cada pedido de venda, o OrderDate é uma data que relaciona Vendas à Data e a Quantidade de Pedidos é uma coluna numérica que representa o número de produtos para cada pedido.

As tabelas Vendas e Data estão relacionadas em OrderDate e Date.

Captura de tela mostrando a exibição do modelo de exemplo. Ela mostra as tabelas Vendas e Datas e uma relação um-para-muitos entre eles em OrderDate e Date.

Calendars

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

NomeDoCalendário Categoria Coluna Primária
Gregoriano Ano Ano
Date Date
GregorianoWithWorkingDay Ano Ano
Date Date
Relacionado ao tempo IsWorkingDay

A definição de TMDL equivalente desses 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   

Medidas

Na tabela 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 mostra 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 para 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 contenha o calendário usado, independentemente se ele não estiver marcado ou se estiver marcado como relacionado ao tempo nesse calendário. Como em nossas definições de medida instruímos DATEADD a voltar 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, não alterou o resultado. A única outra função que exibe esse comportamento é SAMEPERIODLASTYEAR.

Exemplo de deslocamento hierárquico

Agora, vamos examinar um exemplo no qual se uma coluna está marcada como relacionada ao tempo ou não realmente altera o resultado.

Para isso, recriaremos o mesmo visual do exemplo anterior, mas desta vez usaremos 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 total da quantidade, 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, se comportam dessa maneira.

Bônus: se você realmente quiser forçar essas funções a 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 realizam apenas deslocamentos laterais no tempo. Todas as outras funções de inteligência de tempo permitem turnos de tempo hierárquicos.

Usar DATEADD com calendários

A DATEADD função tem parâmetros específicos que permitem controle refinado sobre como as mudanças são executadas quando a seleção está em um nível mais granular do que o nível de deslocamento indicado pelo interval parâmetro em DATEADD. Isso acontece, por exemplo, se você estiver mostrando dados no nível de data, mas definir o interval parâmetro como 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, uma vez que meses em calendários gregorianos variam de comprimento, isso pode levar a ambiguidades ao mudar. Veja abaixo cenários de exemplo com base em um calendário gregoriano:

Mudar de um período mais curto para um período mais longo

Por exemplo, mudar para o mês seguinte a partir de uma seleção em fevereiro, assim o mês de destino é março. Você pode usar o extension parâmetro para influenciar como a mudança é executada:

Valor do parâmetro de extensão Description Resultado
precise Isso mantém rigorosamente o intervalo de datas original. 25 a 28 de fevereiro é transferido para 25 a 28 de março.
extended Permite que a janela se expanda até o final do mês. 25 a 28 de fevereiro é transferido para 25 a 31 de março.

Mudar de um período mais longo para um período mais curto

Por exemplo, ao retroceder um mês a partir de uma seleção em março, o mês alvo passa a ser fevereiro.

Você pode usar o truncation parâmetro para influenciar como a mudança é executada:

Valor do parâmetro de truncamento Description Resultado
anchored Ancora o resultado para a ú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 vazio. Retroceder a data de 31 de março em um mês retorna em branco (como 31 de fevereiro não existe).

Considerações sobre como 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 que está sujeita a regras de segurança em nível de linha (RLS) pode levar a resultados inesperados.
  • O desempenho desse recurso de visualização não representa o produto final.
  • Você ainda não pode criar calendários no Serviço do Power BI.
  • Você não deve usar tabelas automáticas de data/hora com calendários personalizados.
  • Você não pode usar calendários com modelos dinâmicos conectados ou compostos.
  • Recomendamos que você associe apenas as colunas em seu calendário que deseja usar em cálculos de análise 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 resolvê-los primeiro é recomendável. As falhas de validação em tempo real devem ser corrigidas para que seja possível 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, pelo menos, atribuir uma coluna primária a uma categoria
  • Um calendário só pode atribuir colunas de 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 extensões e seus comportamentos, que não são reconhecidos no IntelliSense.
  • Qualquer coluna determinada pode ser mapeada para apenas uma categoria
  • Você não pode aninhar funções de inteligência de tempo que usam calendários. Por exemplo, a instrução DAX a seguir 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 datas de 1º de janeiro de 2010 a 31 de dezembro de 2030 usando o Power Query M ou o DAX. Ele inclui as seguintes colunas: Ano, Número do Mês, Nome do Mês, Ano, 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: