DATEADD DAX per confrontare periodi in Power BI

Gavino Caputo 22 giugno 2026
Diagramma gerarchico di date, utile per funzioni DAX come DATEADD, che mostra le relazioni tra Anno, Trimestre, Mese, Settimana e Giorno.

Indice

Quando un report deve confrontare le vendite con il mese o l’anno precedente, la funzione indicata come dateadd dax è spesso il punto di partenza. DATEADD sposta un insieme di date avanti o indietro nel tempo e permette di costruire misure affidabili per analisi mensili, trimestrali e annuali. Il risultato, però, dipende molto dalla qualità della tabella calendario e dal modo in cui la funzione viene usata dentro CALCULATE.

La logica essenziale per usare DATEADD senza sorprese

  • DATEADD restituisce una tabella di date, non una singola data.
  • Un numero positivo sposta il periodo in avanti, mentre un numero negativo lo riporta indietro.
  • La colonna calendario deve contenere date complete e contigue.
  • Gli intervalli principali sono YEAR, QUARTER, MONTH e DAY; WEEK è disponibile con un riferimento calendario.
  • Per confronti semplici, DATEADD va inserita in CALCULATE insieme a una misura già esistente.

Come funziona davvero DATEADD in DAX

DATEADD prende il contesto di date attivo nel report e lo sposta di un numero definito di intervalli. Con -1 e YEAR, per esempio, chiede a Power BI di lavorare sullo stesso periodo dell’anno precedente. Con 1 e MONTH, invece, porta il contesto un mese in avanti.

La distinzione più importante è questa: DATEADD non calcola direttamente le vendite. Restituisce una tabella contenente le date spostate, che poi viene usata da una misura attraverso il contesto di filtro. Per questo una formula isolata come DATEADD('Calendario'[Data], -1, YEAR) non è normalmente ciò che serve in una scheda del report.

Il modello più comune è:

Vendite anno precedente =
CALCULATE(
    [Vendite totali],
    DATEADD('Calendario'[Data], -1, YEAR)
)

Qui [Vendite totali] è la misura di base, mentre DATEADD modifica soltanto il periodo analizzato. È questo il pattern che uso più spesso, perché mantiene separata la logica del KPI dalla logica temporale e rende la misura più facile da verificare.

La sintassi e i primi esempi pratici

La sintassi classica è:

DATEADD(, , )

Il parametro dell’intervallo non è una stringa. Si scrive quindi MONTH, non "MONTH". Il numero può essere positivo o negativo e deve essere un intero.

Confrontare il mese precedente

Vendite mese precedente =
CALCULATE(
    [Vendite totali],
    DATEADD('Calendario'[Data], -1, MONTH)
)

La misura restituisce le vendite riferite al mese precedente rispetto alla selezione corrente. Se il report è filtrato su maggio, il calcolo cercherà i dati di aprile. Il filtro per prodotto, area o canale resta attivo, quindi il confronto rimane coerente con ciò che l’utente sta osservando.

Calcolare la variazione percentuale

Variazione annua % =
VAR VenditeAttuali = [Vendite totali]
VAR VenditePrecedenti =
    CALCULATE(
        [Vendite totali],
        DATEADD('Calendario'[Data], -1, YEAR)
    )
RETURN
    DIVIDE(
        VenditeAttuali - VenditePrecedenti,
        VenditePrecedenti
    )

Uso DIVIDE invece della semplice divisione perché gestisce meglio il caso in cui il periodo precedente sia vuoto o abbia valore zero. In un report commerciale questo dettaglio evita errori e percentuali impossibili proprio nei periodi con dati scarsi.

Usare giorni e trimestri

Vendite giorno precedente =
CALCULATE(
    [Vendite totali],
    DATEADD('Calendario'[Data], -1, DAY)
)
Vendite trimestre precedente =
CALCULATE(
    [Vendite totali],
    DATEADD('Calendario'[Data], -1, QUARTER)
)

Il risultato dipende sempre dal livello del filtro. Se la visualizzazione mostra un intero trimestre, il confronto è naturale. Se invece il contesto contiene solo alcune date non consecutive, la funzione può restituire un errore o un risultato diverso da quello atteso.

Il modello calendario decide il risultato

Molti problemi attribuiti a DATEADD nascono in realtà dalla tabella delle date. Una buona tabella calendario dovrebbe contenere una riga per ogni giorno, senza buchi, con una colonna data impostata come tipo Date e una relazione corretta con la tabella dei fatti.

In Power BI conviene usare una tabella calendario dedicata invece di trascinare direttamente la data della tabella vendite nei calcoli temporali. La tabella dovrebbe coprire tutto il periodo necessario, anche i giorni in cui non sono state registrate vendite. Senza questa continuità, il confronto tra periodi può diventare incompleto.

Calendario =
CALENDAR(
    DATE(2020, 1, 1),
    DATE(2030, 12, 31)
)

Da questa tabella si possono aggiungere anno, mese, numero del mese, trimestre e anno-mese. Per l’ordinamento, il nome del mese deve essere ordinato tramite il relativo numero progressivo, altrimenti aprile potrebbe comparire prima di febbraio.

Con una colonna data come input, DATEADD richiede normalmente un insieme di date contiguo. Se seleziono soltanto lunedì e venerdì senza includere i giorni intermedi, non sto passando un intervallo continuo. È uno dei controlli che faccio sempre quando una misura restituisce un errore apparentemente inspiegabile.

Colonna di date o riferimento calendario

Nelle versioni più recenti del motore DAX è possibile passare anche un riferimento calendario con colonne temporali marcate. In questo caso il risultato può includere le colonne principali del calendario e offrire un controllo più preciso nei casi in cui la granularità selezionata sia più dettagliata dell’intervallo spostato.

Con un calendario si possono inoltre gestire alcuni casi limite tramite i parametri Extension e Truncation. Per esempio, lo spostamento di un intervallo a fine febbraio verso marzo può estendere il risultato fino alla fine del mese oppure mantenere soltanto le date corrispondenti, a seconda dell’impostazione scelta.

DATEADD, SAMEPERIODLASTYEAR e PARALLELPERIOD

Queste funzioni vengono spesso trattate come equivalenti, ma non lo sono del tutto. La scelta corretta dipende da quanto controllo serve sul periodo da confrontare.

Funzione Uso principale Particolarità
DATEADD Spostare il contesto di giorni, mesi, trimestri o anni È la soluzione più flessibile
SAMEPERIODLASTYEAR Confrontare lo stesso periodo dell’anno precedente È più leggibile nei confronti annuali standard
PARALLELPERIOD Confrontare periodi completi Lavora meglio quando interessa l’intero mese, trimestre o anno

Per un confronto annuale classico, questa formula è molto chiara:

Vendite stesso periodo anno precedente =
CALCULATE(
    [Vendite totali],
    SAMEPERIODLASTYEAR('Calendario'[Data])
)

Preferisco DATEADD quando il periodo deve essere spostato dinamicamente, per esempio di tre mesi o di quattordici giorni. SAMEPERIODLASTYEAR, invece, comunica subito l’intenzione e può rendere più leggibile una misura usata da molti analisti.

PARALLELPERIOD è utile quando vuoi lavorare con periodi completi. Se il contesto contiene alcuni giorni di un mese, la differenza rispetto a DATEADD può diventare importante. Prima di sostituire una funzione con un’altra, controllo sempre se il requisito parla di stesso intervallo selezionato oppure di periodo di calendario completo.

Gli errori più comuni e come correggerli

La tabella calendario contiene buchi

È la causa più frequente. Una data mancante, un intervallo incompleto o una relazione inattiva possono impedire lo spostamento corretto. La correzione consiste nel creare una tabella calendario continua e nel collegarla alla colonna data della tabella dei fatti con una relazione uno-a-molti.

La funzione viene usata per ottenere una singola data

DATEADD restituisce una tabella di date, quindi non è la scelta ideale per aggiungere semplicemente sette giorni a una data scalare. In una colonna calcolata, quando serve un’operazione elementare, può bastare:

Data consegna = Ordini[Data ordine] + 7

Qui non stiamo facendo time intelligence, ma aritmetica sulle date. Confondere i due casi porta spesso a formule più complesse del necessario.

I nomi degli intervalli sono racchiusi tra virgolette

La forma corretta è YEAR, MONTH o DAY. Scrivere "YEAR" tratta l’intervallo come testo e può generare un errore di sintassi. Anche il separatore degli argomenti può cambiare in base alla configurazione locale di Power BI, quindi in alcuni ambienti è necessario usare il punto e virgola al posto della virgola.

Il filtro contiene date non consecutive

Una selezione parziale può cambiare il significato del confronto. Se vuoi confrontare il mese intero, assicurati che il visual lavori a livello di mese o che la misura ricostruisca esplicitamente il periodo desiderato. Per analisi su giorni lavorativi, festività o calendari fiscali, il calendario deve contenere colonne dedicate, non soltanto una data standard.

Leggi anche: Power BI API e DAX per integrare dati, report e automazioni

La misura funziona in una tabella ma non in una scheda

In una tabella ogni riga può fornire un contesto temporale preciso, mentre una scheda mostra spesso un insieme più ampio di date. Se la misura non è corretta a livello totale, verifico il contesto con una misura di controllo e controllo quali date arrivano davvero a CALCULATE. Il problema non è sempre DATEADD, ma il modo in cui il visual applica i filtri.

Come rendere il calcolo più robusto

Parto sempre da una misura base semplice, come [Vendite totali], e costruisco sopra le varianti temporali. Questo approccio riduce la duplicazione e rende più facile capire se l’errore riguarda i dati, la relazione o il filtro temporale.

  • Controlla che la tabella calendario copra tutto l’intervallo analizzato.
  • Usa la colonna data del calendario, non una data proveniente direttamente dalla tabella transazionale.
  • Verifica che la relazione sia attiva e che il tipo dati sia realmente Data.
  • Testa la misura su giorno, mese e anno per capire come cambia il contesto.
  • Gestisci i periodi senza dati con COALESCE o con una logica esplicita, evitando di trasformare automaticamente un valore mancante in zero quando la distinzione è significativa.

Nei modelli con calendario fiscale o 4-4-5 non do per scontato che lo spostamento di un anno solare sia corretto. In questi casi il riferimento calendario e lo spostamento per mesi o periodi fiscali possono rappresentare meglio la realtà aziendale rispetto a un semplice YEAR.

Ricordo anche un limite pratico: la funzione non è adatta a essere usata indiscriminatamente nelle visual calculations, dove il contesto è già stato elaborato dal visual e il risultato può perdere significato. Per le misure tradizionali di un modello semantico, invece, resta uno degli strumenti più utili per la time intelligence.

Il controllo finale prima di pubblicare il report

Una misura DATEADD ben scritta non basta da sola. Il risultato è affidabile quando formula, calendario, relazione e livello del visual raccontano la stessa storia.

Se il confronto serve soltanto a mostrare l’anno precedente, SAMEPERIODLASTYEAR può essere più leggibile. Se devi spostare periodi variabili, gestire mesi o trimestri e mantenere maggiore controllo, DATEADD è in genere la scelta più adatta.

Il mio controllo conclusivo è semplice: verifico un mese completo, un singolo giorno e un totale annuale, poi confronto i risultati con un calcolo manuale su un campione. Bastano pochi minuti per scoprire buchi nel calendario, filtri inattesi e differenze tra periodo selezionato e periodo completo.

Domande frequenti

Si inserisce DATEADD dentro CALCULATE insieme alla misura di base, usando un intervallo negativo di un mese: CALCULATE([Vendite totali], DATEADD('Calendario'[Data], -1, MONTH)). Gli altri filtri attivi, come prodotto, area o canale, restano applicati.

Deve contenere una riga per ogni giorno, senza buchi, coprire tutto il periodo analizzato e avere una colonna impostata come tipo Data. È inoltre necessaria una relazione attiva e corretta tra il calendario e la tabella dei fatti.

DATEADD è più flessibile e consente di spostare il contesto di giorni, mesi, trimestri o anni. SAMEPERIODLASTYEAR è più leggibile per confrontare lo stesso periodo dell’anno precedente, mentre PARALLELPERIOD è indicata quando servono periodi completi di mese, trimestre o anno.

Con una colonna data, DATEADD richiede normalmente un insieme di date contiguo. Se il filtro include soltanto date isolate, come lunedì e venerdì senza i giorni intermedi, il contesto non rappresenta un intervallo continuo e il risultato può essere errato o generare un errore.

Valuta l'articolo

Valutazione: 0.00 Numero di voti: 0

Tag

calculate
calendario
dateadd
sameperiodlastyear
parallelperiod
Autor Gavino Caputo
Gavino Caputo
Mi chiamo Gavino Caputo e da 14 anni mi occupo con passione di analisi dati, Business Intelligence e Data Science. Ho iniziato questo percorso perché sono sempre stato affascinato dalla possibilità di trasformare grandi volumi di informazioni in conoscenza utile e fruibile. Sul sito mondobi.it, il mio obiettivo è quello di rendere accessibili concetti complessi, condividendo la mia esperienza per aiutare a comprendere meglio il mondo dei dati, le sue applicazioni e le tendenze emergenti. Cerco di fornire contenuti accurati e aggiornati, spiegando i temi in modo chiaro e strutturato, basandomi su un confronto costante tra le diverse fonti e metodologie che incontro nel mio lavoro quotidiano.

Condividi post

Scrivi un commento