# A date slicer with presets and year-over-year comparison

> Get started with Period Plume: build a date table, avoid the date hierarchy trap, and add a slicer that picks a period right on the trend of a measure.

- Language: English
- Web page: https://plumevisuals.com/en/tutorials/segment-de-dates-periodes
- Published: 2026-10-01
- Visual: Period Plume, technical reference: https://plumevisuals.com/ai/visuals/period-pulse.md
- If an option name in this tutorial differs from the technical reference, the reference is right (it is generated from the visual's code).

## At a glance

- **What the visual does.** Period Plume is a date slicer (a visual that filters the rest of the page to a period). It draws a small **timeline** of a measure over time (revenue day by day, for example) and lets you draw the period right on it, the way you highlight a passage in a text. Buttons set common periods in one click ("Last 30 days", "Year to date", "Last 12 months"…), and a comparison ★ shows the difference with the previous year.
- **When to use it:**
  - a dashboard that must always show "the last 30 days" or "this month," even after tomorrow's refresh;
  - picking a period while seeing whether it was quiet or busy;
  - comparing a period with the same period last year ★;
  - monthly, quarterly or yearly data (the visual adapts on its own).
- **When to use something else:** to click specific days in a calendar (one date, one week, only Fridays), use Date Picker Plume. To filter numbers (price, age), use Range Plume.
- **By the end, you will know how to:**
  - create a date table, mark it and relate it to your data;
  - avoid the automatic date hierarchy trap;
  - set up the presets and their reference date;
  - open the report on a default period;
  - show the year-over-year comparison ★ and create a last-year measure for the rest of the report.
- **What you need:** Power BI Desktop (a recent version), the Period Plume visual installed (see [the shared basics](/en/tutorials/bien-demarrer-visuels-plume)), a column of **dates** and, ideally, a measure to track (revenue, orders, visits).

**Range, Period or Date Picker: which of the three slicers should you pick?**

| What you need | Slicer to pick | Why |
|---|---|---|
| Filter **numbers** between a minimum and a maximum (price, floor area, age, lead time) | **Range Plume** | It reads a numeric column and shows how the values are spread (histogram). It does not accept dates. |
| Pick a **period** while seeing the **trend** of a measure, with **rolling** periods ("Last 30 days" that moves forward every day) and a year-over-year comparison ★ | **Period Plume** | It draws a timeline of the measure and sends relative date filters. It also accepts monthly or yearly data. |
| Pick **specific days in a calendar**: one date, one week, one month, several dates ★, or only certain days (Fridays, month ends), with days without data grayed out | **Date Picker Plume** | It shows a real month-by-month calendar and rules for which dates can be selected. Its shortcuts send fixed dates. |

## The data you need

**The expected shape.** Period Plume receives **one row per distinct date**, with the value of the measure on that day:

| Date | Measure (trend) |
|---|---|
| 2025-03-01 | 12,480 |
| 2025-03-02 | 9,915 |
| … | … |

So it needs:

- **a date column** (type *Date* or *Date/time*): this is the column the slicer filters. A column of years as whole numbers (2001, 2002…) is accepted too;
- **a measure**, optional (a DAX calculation, see the [glossary](/en/tutorials/bien-demarrer-visuels-plume#glossary)): it draws the timeline and feeds the comparison ★. Without a measure, the timeline simply counts the dates.

### What is a date table (calendar), and why create one?

A **date table** (also called a "calendar") is a table with **one row per day, with no gaps**, from the first to the last day of the period you study, often with handy columns (year, month). It holds no sales: it is the shared reference for everything related to time.

Why not filter the `Date` column of the sales table directly?

- **Days without sales are missing from it**: a Sunday or a closing day does not exist in the sales table, so the timeline has gaps and "same period last year" calculations go wrong.
- **A single date table can filter several tables** (sales, returns, budget) at once.
- **DAX "time intelligence" functions** (calculations over time, such as `SAMEPERIODLASTYEAR`, which shifts a period back one year) require a continuous date column.

It works through a **relationship** (a link between two tables, see the [glossary](/en/tutorials/bien-demarrer-visuels-plume#glossary)): the date table is on the "one" side (each day appears once), the sales table on the "many" side (one day can have several sales). Filtering the calendar then filters the sales.

Finally, you **mark** the table as a date table: Power BI then knows which column is the reference for time, and it stops creating an automatic hierarchy for that table (see the next section).

### What is a date hierarchy, and why avoid it here?

By default, Power BI quietly creates a **hierarchy** (a set of nested levels) for every date column: **Year › Quarter › Month › Day**. When you drag the column into a visual, this hierarchy often comes in instead of the date itself. That is handy for a chart you drill down level by level, but it gets in the way of a date slicer: Period Plume then only uses the **Year** level, and the timeline only shows years.

To avoid it, right-click the field (or click its arrow) in the visual's **Date** well and choose **Date** instead of **Date Hierarchy**. With a marked date table, the problem goes away. To turn these hierarchies off for the whole file: **File › Options and settings › Options › Current File › Data Load**, then clear **Auto date/time**.

> **Tip:** **Tip**: if the **Year** level of a hierarchy still ends up in the **Date** well, the filter works anyway (Period Plume filters the original date column), but only by whole years.

**Sample dataset**: made-up sales from a small shop (online and in store), table `Sales`, over 2024 and 2025.

| Date | Channel | Orders | Amount |
|---|---|---|---|
| 2024-03-12 | Online | 42 | 3150 |
| 2024-06-05 | Store | 38 | 2870 |
| 2024-09-18 | Online | 51 | 3920 |
| 2024-11-29 | Online | 96 | 7840 |
| 2024-12-14 | Store | 74 | 5610 |
| 2025-01-08 | Online | 35 | 2560 |
| 2025-03-15 | Store | 47 | 3480 |
| 2025-06-20 | Online | 58 | 4410 |
| 2025-09-02 | Online | 61 | 4790 |
| 2025-11-28 | Online | 112 | 9350 |
| 2025-12-13 | Store | 81 | 6240 |
| 2025-12-30 | Online | 44 | 3300 |

The same dataset, ready to paste into **Modeling › New table**:

```dax
Sales =
DATATABLE (
    "Date", DATETIME,
    "Channel", STRING,
    "Orders", INTEGER,
    "Amount", DOUBLE,
    {
        { "2024-03-12", "Online", 42, 3150 },
        { "2024-06-05", "Store", 38, 2870 },
        { "2024-09-18", "Online", 51, 3920 },
        { "2024-11-29", "Online", 96, 7840 },
        { "2024-12-14", "Store", 74, 5610 },
        { "2025-01-08", "Online", 35, 2560 },
        { "2025-03-15", "Store", 47, 3480 },
        { "2025-06-20", "Online", 58, 4410 },
        { "2025-09-02", "Online", 61, 4790 },
        { "2025-11-28", "Online", 112, 9350 },
        { "2025-12-13", "Store", 81, 6240 },
        { "2025-12-30", "Online", 44, 3300 }
    }
)
```

The date table, also created with **Modeling › New table**:

```dax
Calendar =
ADDCOLUMNS (
    // CALENDAR creates a [Date] column: one day per row, no gaps,
    // from January 1, 2024 to December 31, 2025
    CALENDAR ( DATE ( 2024, 1, 1 ), DATE ( 2025, 12, 31 ) ),
    // Handy columns for other visuals (optional)
    "Year", YEAR ( [Date] ),
    "Month Number", MONTH ( [Date] ),
    "Month", FORMAT ( [Date], "mmm yyyy" )
)
```

**The measures to create** (**Modeling › New measure**):

```dax
// Total revenue in the current context
// (the chosen period, a day of the timeline…). Drag it into "Measure (trend)".
Revenue = SUM ( Sales[Amount] )

// Number of orders, to drag into "Tooltips" (optional)
Order Count = SUM ( Sales[Orders] )

// Revenue for the same period, one year earlier.
// SAMEPERIODLASTYEAR shifts the filtered dates back one year;
// CALCULATE computes revenue over those shifted dates.
// This measure automatically follows the period chosen in Period Plume.
Revenue LY =
CALCULATE ( [Revenue], SAMEPERIODLASTYEAR ( Calendar[Date] ) )

// Change in % vs. last year. DIVIDE avoids an error when last year is 0.
Change vs LY = DIVIDE ( [Revenue] - [Revenue LY], [Revenue LY] )
```

**Common setup pitfalls**

- **Dates stored as text.** "2024-03-12" typed as text is not a date: the visual rejects it or gets it wrong. The type must be *Date* or *Date/time* (**Column tools › Data type**).
- **Date/time vs. Date.** `DATATABLE` creates `Sales[Date]` as *Date/time*. Switch it to *Date* for a clean relationship with the calendar.
- **Calendar too short.** The date table must cover **all** sales dates, plus the previous year so that `Revenue LY` works.
- **Missing relationship.** Without a relationship between `Calendar[Date]` and `Sales[Date]`, the slicer filters the calendar… and nothing else.
- **Data that stops in the past.** Here the sales stop at the end of 2025: "Last 30 days" counted from today shows nothing. The walkthrough fixes this.

## Step by step: your first Period Plume in 15 minutes

1. In **Modeling › New table**, paste the code of the `Sales` table and confirm. The table appears in the **Data** pane with 12 rows.
2. Select the `Sales[Date]` column, then in **Column tools › Data type**, choose *Date*. The column no longer shows a time.
3. In **Modeling › New table**, paste the code of the `Calendar` table and confirm. The table has 731 rows, one per day of 2024 and 2025.
4. Select the `Calendar` table, then **Table tools › Mark as date table**, and choose the `Date` column. Power BI checks that the column is continuous and has no duplicates.
5. Open **Model view** (the diagram icon in the left bar) and drag `Calendar[Date]` onto `Sales[Date]`. A *One to many (1:\*)* relationship appears, with the "1" on the `Calendar` side.

6. Go back to **Report view**, select the `Sales` table, then create the `Revenue`, `Order Count` and `Revenue LY` measures (**Modeling › New measure**).
7. In the **Visualizations** pane, click the **Period Plume** icon, then drag `Calendar[Date]` into the **Date** well. Check that the field is called "Date" and not "Date Hierarchy" (if not: right-click the field › **Date**). The timeline appears, flat: without a measure, it counts the dates.
8. Drag `Revenue` into **Measure (trend)**. The timeline draws revenue by week (the granularity chosen automatically for two years of data), with peaks at the end of each year.
9. In the **Format** pane, **Presets** card, set **Reference date** to *Last date in the data*. The presets are now counted from the last sale (late December 2025) instead of today.
10. Next to it, add a native **Card** visual with the `Revenue` measure. It shows 57,520 (the total for both years).
11. In Period Plume, click the **Year to date** button. The 2025 period is highlighted on the timeline, the **From** and **To** boxes update, and the card shows 34,130.

12. Now draw a period with the mouse on the timeline, then drag it as a block. The card follows each time you release the mouse.

## Troubleshooting

| What you see | Likely cause | Fix |
|---|---|---|
| The timeline only shows years | The date hierarchy was dragged in (only its Year level is used), or every date is January 1 | Right-click the field in the **Date** well › **Date** |
| "Last 30 days" shows nothing | The data stops before today and **Reference date** = *Today* | **Reference date** › *Last date in the data* |
| The filter does not move forward the next day | Preset counted from the last date in the data, a drawn or typed period, "This quarter" or a custom period: these are fixed periods | Use a rolling preset with *Today* and **Rolling preset (moves with each refresh)** turned on |
| Other visuals are not filtered | The date table is not related to the sales table | Create the relationship `Calendar[Date]` 1 → \* `Sales[Date]` |
| `Revenue LY` stays blank | The calendar does not cover the previous year, or it is not related | Extend `CALENDAR` and check the relationship |
| Start or end date off by one day | Date column stored as text | Switch the column to the *Date* type |
| The comparison does not show | **Show ★** is off by default, or there is no measure in **Measure (trend)**, or last year's dates are missing from the data | Turn it on, add a measure, cover the previous year |
| A "Premium preview" watermark appears | Comparison ★ turned on, **Custom periods ★** filled in, or a style, palette or Theme JSON ★, without a valid key | Turn off the ★ feature or paste a key (shared basics) |

## Key takeaways

- A marked date table related to the sales, plus a measure: that is the foundation of a good date slicer.
- Drag in the **Date**, not the **Date Hierarchy**.
- **Reference date** and **Rolling preset (moves with each refresh)** decide whether a period moves forward on its own every day.
- The visual's comparison ★ is for display; for the rest of the report, use `SAMEPERIODLASTYEAR`.
- To click specific days in a calendar, use Date Picker Plume instead.

## Learn more

- [Period Plume: 8 how-to guides (last 30 days, year over year, seasons…)](/en/tutorials/period-plume-cas-pratiques): recipes for everyday needs.
- [Period Plume: every field and setting explained](/en/tutorials/period-plume-champs-et-reglages): each field well and each setting.
- [Getting started with Plume visuals](/en/tutorials/bien-demarrer-visuels-plume): installation, license, styles and settings shared by every visual.
- The visual's page: [Period Plume](/en/visuals/period-pulse). A question? [Support](/en/support).
