(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Como calcular dias úteis entre datas em DAX: passo a passo

João Barros 12 de September de 2026 3 min de leitura

Calcular dias úteis entre duas datas em DAX é uma necessidade comum em relatórios de projectos, SLA e operações onde os fins de semana e feriados não contam para o prazo. Este guia explica o porquê da lógica (filtrar a Date table, excluir dias da semana e feriados) e dá exemplos concretos com código DAX mínimo que pode colar em Power BI Desktop. Ao seguir os passos vai obter medidas reusáveis e fáceis de testar.

Pré-requisitos

  • Power BI Desktop ou Analysis Services com suporte a DAX.
  • Uma Date table (tabela de datas) com coluna Date e colunas Year, Month, Weekday, etc. Idealmente marcada como Date table em Modelação.
  • Uma tabela de eventos/actividades com colunas StartDate e EndDate.
  • Uma tabela de Feriados (HolidayDate) com uma coluna Date específica para os feriados a excluir.

Estas tabelas permitem usar filtros por intervalo e funções como FILTER, COUNTROWS, EXCEPT ou RELATEDTABLE em DAX. Para conjuntos de dados muito grandes (por exemplo, >100k linhas em Activities) considere medir performance: SUMX por linha é funcional mas pode ser mais lento do que uma solução em colunas calculadas ou pré-agregadas.

Passo 1: Preparar a Date table

É essencial ter uma Date table marcada como Date table em Power BI. A Date table facilita criar filtros entre StartDate e EndDate e calcular colunas como Weekday que depois usamos para excluir sábado e domingo. Exemplos: calendário de 2020 a 2026 cobre 7 anos — 2 557 dias (aprox.).

// Exemplo mínimo de criação de Date table em DAX (Nova tabela)
Date =
CALENDAR(DATE(2020,1,1), DATE(2026,12,31))

// Adicionar dia da semana (1=Domingo..7=Sábado)
Date =
ADDCOLUMNS(
  CALENDAR(DATE(2020,1,1), DATE(2026,12,31)),
  "Year", YEAR([Date]),
  "Month", MONTH([Date]),
  "Weekday", WEEKDAY([Date],1) // 1 = domingo
)

Nota sobre WEEKDAY: WEEKDAY([Date],1) retorna 1=domingo ... 7=sábado. Se preferir usar 1=segunda..7=domingo use WEEKDAY([Date],2) e então exclua {6,7} para sábado/domingo. Confirme a convenção para evitar excluir dias errados.

Passo 2: Criar a tabela de Feriados

Crie uma tabela simples com as datas de feriados. Pode ser importada de um ficheiro CSV, mantida manualmente ou criada em DAX para exemplo. Para 2024 inclua feriados fixos e, se possível, os móveis (Páscoa) — isto evitará contagens incorrectas. Exemplo com 3 feriados para teste:

// Exemplo de tabela de feriados em DAX (Nova tabela)
Holidays =
DATATABLE(
  "HolidayDate", DATE,
  {
    { DATE(2024,1,1) },
    { DATE(2024,4,25) },
    { DATE(2024,12,25) }
  }
)

Para Portugal, 25 de Abril e 1 de Maio são típicos; inclua também feriados regionais se necessário. Valide que as datas estão dentro do intervalo da Date table.

Passo 3: Relacionar tabelas

Crie relações entre a Date table e a tabela de Feriados (Date[Date] -> Holidays[HolidayDate]) e, se fizer sentido, entre Date table e a tabela de Activities (por exemplo, usando uma relação activa em Date[Date] para permitir navegação por datas). Estas relações permitem que funções de filtro em DAX ajam correctamente no contexto do modelo.

Sem relações adequadas, funções como RELATEDTABLE ou FILTER podem não encontrar as linhas esperadas e as medidas vão devolver valores errados. Verifique o sentido da relação (one-to-many) e se a coluna Date é do tipo date.

Passo 4: Medida para contar dias úteis entre duas datas (exemplo)

A medida abaixo mostra a ideia: filtramos a Date table pelo intervalo StartDate..EndDate, excluímos fins de semana e subtraímos os feriados usando EXCEPT. O exemplo é seguro para intervalos que podem abranger vários anos.

Business Days =
VAR _Start = MIN(Activities[StartDate])
VAR _End = MAX(Activities[EndDate])

RETURN
CALCULATE(
  COUNTROWS('Date'),
  FILTER(
    'Date',
    'Date'[Date] >= _Start &&
    'Date'[Date] <= _End &&
    NOT('Date'[Weekday] IN {1,7}) && // 1=domingo,7=sábado se WEEKDAY(...,1)
    NOT( RELATEDTABLE(Holidays) ) // ver nota abaixo
  )
)

Nota técnica: RELATEDTABLE(Holidays) não funciona como booleano directo — por isso a alternativa mais robusta é usar EXCEPT para remover as datas que aparecem na tabela Holidays dentro do mesmo intervalo. A versão com EXCEPT está logo abaixo no mesmo ficheiro de código e é a recomendada.

Passo 5: Medida alternativa com SUMX (caso de linhas independentes)

Se quiser calcular dias úteis por cada linha da tabela Activities (por exemplo, soma de dias úteis por projecto), use SUMX para iterar por linha. Isto é útil quando cada linha tem StartDate/EndDate distintos e quer o total agregado. Exemplo de performance: para 10 000 linhas, SUMX pode demorar segundos; considere optimizar se necessário.

Business Days Per Activity =
SUMX(
  Activities,
  VAR _s = Activities[StartDate]
  VAR _e = Activities[EndDate]
  VAR _d =
    EXCEPT(
      SELECTCOLUMNS(FILTER('Date', 'Date'[Date] >= _s && 'Date'[Date] <= _e && NOT('Date'[Weekday] IN {1,7})), "D", 'Date'[Date]),
      SELECTCOLUMNS(FILTER(Holidays, Holidays[HolidayDate] >= _s && Holidays[HolidayDate] <= _e), "D", Holidays[HolidayDate])
    )
  RETURN COUNTROWS(_d)
)

Exemplo concreto: para Activities com StartDate = 2024-04-22 e EndDate = 2024-04-30, dias totais = 9, fim de semana (27-28) = 2, feriado (25-04) dentro do intervalo = 1 → Business Days = 9 - 2 - 1 = 6. Teste casos como mesma data, intervalo que começa e termina em fim de semana e intervalos que incluem vários feriados seguidos.

Verificar o resultado

Crie um visual de tabela com Activities[StartDate], Activities[EndDate] e a medida Business Days ou Business Days Per Activity. Verifique manualmente para alguns registos: conte dias entre datas, subtraia sábados/domingos e confirme que as datas em Holidays são excluídas. Erros comuns: Date table não marcada como Date table, Weekday mal interpretado (confirme base 1 ou 2), feriados fora do intervalo ou relação inexistente. Para validar em massa, filtre por um mês e compare com um cálculo em Excel para 50 linhas de teste.

Conclusão

Com estas medidas consegue calcular dias úteis entre duas datas em DAX, excluindo fins de semana e feriados. Para produção: mantenha a tabela de feriados actualizada (inclua feriados móveis), documente a convenção de WEEKDAY no modelo e teste casos limite. Se precisar de maior desempenho para milhares de linhas, considere colunas calculadas em vez de SUMX ou pré-processamento na camada ETL. Dica final: crie uma medida de controlo que devolva os dias de fim de semana e os feriados encontrados por intervalo para facilitar a auditoria.