Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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:
- Power Query M. Você pode usar a função List.Dates . Um exemplo é fornecido mais adiante neste documento.
- DAX. Você pode usar as funções CALENDAR ou CALENDARAUTO para gerar uma tabela básica de datas calculadas. Você também pode usar uma instrução DAX mais avançada para criar uma tabela de data. Um exemplo é fornecido mais adiante neste documento.
- Ferramentas externas.
- Carregando de uma fonte, como um sistema de origem, um arquivo ou outro modelo semântico do Power BI.
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 .
- No Power BI Desktop, vá para Arquivo > Opções e definições > Opções > Funcionalidades de pré-visualização.
- Selecione a pré-visualização de Enhanced DAX Time Intelligence.
- Selecione OK
- 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:
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:
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
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.
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á:
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.
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:
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:
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:
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
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:
- Todas as dependências de categoria de X. Isto pode ser entendido como todas as categorias superiores a X.
- 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.
Colunas relacionadas com o tempo
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.
Em primeiro lugar, todas as dependências da categoria "Trimestre" seriam consideradas.
Em seguida, seriam analisados todos os dependentes de "Quarter" e suas dependências.
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.
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 :
Aqui estão algumas linhas de exemplo na tabela Sales :
As tabelas Sales e Date estão relacionadas em 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:
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:
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.
Conteúdo relacionado
Para obter mais informações relacionadas a este artigo, consulte os seguintes recursos: