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.
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
COALESCEo 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.
