Scenario:
Suppose we want to generate Rolling Period Flags and Fixed Period Flags in a Calendar table based on the Today() date. Let’s assume today is April 10, 2026.
In reporting and analytics, dates are the backbone of the comparison of trends, and insights. The business users often need to filter data by relative time windows (like “last 30 days”) or by absolute calendar periods (like “Q1 2026”).
The Rolling and Fixed Period Flags become helpful to classify each date in the calendar table into meaningful categories that can be directly used in reports, dashboards, and KPIs.
The Rolling and Fixed Period Flags become helpful to classify each date in the calendar table into meaningful categories that can be directly used in reports, dashboards, and KPIs.
Rolling Period Date Range Flags:
Rolling periods are dynamic, relative to today. Rolling flags are perfect for trend analysis and monitoring ongoing activity. They move forward continuously as time progresses. This means the definition of “Last 7 Days” or “Last 1 Month” changes every day.
Example (with April 10, 2026 as Today):
- April 10, 2026: Today
- April 9, 2026: Previous Day
- April 3–10, 2026: Last 7 Days
- March 10–April 10, 2026: Last 1 Month
- January–March 2026: Last 1 Quarter
- April 2025–April 2026: Last 1 Year
- Any date older than April 10, 2025: Historical
- Any date after April 10, 2026: Future
How Rolling Period Date Range flags helps in Business Reporting:
Rolling flags are perfect for trend analysis and monitoring ongoing activity because they always move relative to today. In a sales context, this means:
- Sales in the last 30 days: Helps track short‑term performance and spot momentum or slowdowns.
- Sales in the past 7 days: Useful for weekly monitoring, promotions, or campaign impact.
- Sales in the last quarter: Shows how the business is performing in the most recent 90‑day window, regardless of calendar boundaries.
- Sales in the last year: Provides a rolling year‑to‑date view, ideal for understanding long‑term growth or decline.
Fixed Period Date Range Flags:
Fixed periods are anchored to established calendar boundaries. They classify dates into complete units such as weeks, months, quarters, or years. Unlike rolling periods, which shift continuously day by day, fixed periods remain aligned with the defined calendar structure, ensuring consistency for reporting and comparisons.
Example (with April 10, 2026 as Today):
- April 10, 2026: Today
- April 11, 2026: Next Day
- April 6–12, 2026: Current Week
- March 2026: Previous Month
- Q2 2026: Current Quarter
- Q1 2026: Previous Quarter
- 2026: Current Year
- 2025: Previous Year
How Fixed Period Date Range flags helps in Business Reporting:
Fixed flags are anchored to calendar boundaries, which makes them essential for structured comparisons. In sales reporting, this means:
- Current Month vs Previous Month: Compare March sales with April sales to measure month‑over‑month growth.
- Current Quarter vs Previous Quarter: Evaluate Q2 sales against Q1 to understand quarterly performance.
- Current Year vs Previous Year: Assess year‑over‑year growth, a key metric for stakeholders and investors.
- Current Week vs Previous Week: Useful for weekly sales dashboards aligned with business calendars.
Now we can create / define a Calendar table with these Rolling and Fixed Period flags using the below Power Query logic:
let
/* ================================
Define Date Range
================================ */
_Today = Date.From(DateTime.LocalNow()), /* Current date */
_CurrentYear = Date.Year(_Today), /* Current Year */
_PreviousYear = _CurrentYear - 1, /* Previous Year */
_MinDate = #date(_PreviousYear, 1, 1), /* Start Date: Jan 1 of Previous Year */
_MaxDate = #date(_CurrentYear, 12, 31), /* End Date: Dec 31 of Current Year */
/* ================================
Generate List of Dates
================================ */
_DateList = List.Dates(
_MinDate,
Duration.Days(_MaxDate - _MinDate) + 1,
#duration(1,0,0,0)
),
_CalendarBase = Table.TransformColumnTypes(
Table.FromList(_DateList, Splitter.SplitByNothing(), {"Date"}, type table [Date = Date.Type]),
{{"Date", type date}}
),
/* ================================
Standard Date Attributes
================================ */
_DayOfWeekNum = Table.AddColumn(_CalendarBase, "Week_Day_No", each Date.DayOfWeek([Date], Day.Sunday) + 1, Int64.Type),
_WeekOfYear = Table.AddColumn(_DayOfWeekNum, "Week_Of_Year", each Date.WeekOfYear([Date]), Int64.Type),
_DayOfWeekName = Table.AddColumn(_WeekOfYear, "Week_Day_Name", each Text.Start(Date.DayOfWeekName([Date]),3), type text),
_MonthNum = Table.AddColumn(_DayOfWeekName, "Month_No", each Date.Month([Date]), Int64.Type),
_MonthName = Table.AddColumn(_MonthNum, "Month_Name", each Date.MonthName([Date]), type text),
_Quarter = Table.AddColumn(_MonthName, "Qtr_No", each "Q" & Text.From(Date.QuarterOfYear([Date])), type text),
_Year = Table.AddColumn(_Quarter, "Year", each Date.Year([Date]), Int64.Type),
_YearMonthKey = Table.AddColumn(_Year,"Year_Month_Key", each [Year] * 100 + Date.Month([Date]), Int64.Type),
/* ================================
Rolling Period Classification:
Past → Present → Future
================================ */
_RollingPeriodFlag = Table.AddColumn(_YearMonthKey, "Rolling_Period_Flag", each
if [Date] = _Today then "Today"
else if [Date] = Date.AddDays(_Today, -1) then "Previous Day"
else if [Date] >= Date.AddDays(_Today, -7) and [Date] <= _Today then "Last 7 Days"
else if [Date] >= Date.AddWeeks(_Today, -1) and [Date] <= _Today then "Last 1 Week"
else if [Date] >= Date.AddMonths(_Today, -1) and [Date] <= _Today then "Last 1 Month"
else if [Date] >= Date.AddQuarters(_Today, -1) and [Date] <= _Today then "Last 1 Quarter"
else if [Date] >= Date.AddYears(_Today, -1) and [Date] <= _Today then "Last 1 Year"
else if [Date] > _Today and [Date] <= Date.AddWeeks(_Today, 1) then "Next Week"
else if [Date] > _Today and [Date] <= Date.AddMonths(_Today, 1) then "Next Month"
else if [Date] > _Today and [Date] <= Date.AddQuarters(_Today, 1) then "Next Quarter"
else if [Date] > _Today and [Date] <= Date.AddYears(_Today, 1) then "Next Year"
else if [Date] > Date.AddYears(_Today, 1) then "Future"
else "Historical"
, type text),
/* ================================
Fixed Period Classification:
Day → Week → Month → Quarter → Year
================================ */
_FixedPeriodFlag = Table.AddColumn(_RollingPeriodFlag, "Fixed_Period_Flag", each
let
_CurrentWeekNo = Date.WeekOfYear(_Today),
_CurrentMonthNo = Date.Month(_Today),
_CurrentQtrNo = Date.QuarterOfYear(_Today),
_CurrentYearNo = Date.Year(_Today)
in
if [Date] = _Today then "Today"
else if [Date] = Date.AddDays(_Today, 1) then "Next Day"
else if [Week_Of_Year] = _CurrentWeekNo and [Year] = _CurrentYearNo then "Current Week"
else if [Week_Of_Year] = _CurrentWeekNo - 1 and [Year] = _CurrentYearNo then "Previous Week"
else if [Week_Of_Year] = _CurrentWeekNo + 1 and [Year] = _CurrentYearNo then "Next Week"
else if [Month_No] = _CurrentMonthNo and [Year] = _CurrentYearNo then "Current Month"
else if [Month_No] = _CurrentMonthNo - 1 and [Year] = _CurrentYearNo then "Previous Month"
else if [Month_No] = _CurrentMonthNo + 1 and [Year] = _CurrentYearNo then "Next Month"
else if Date.QuarterOfYear([Date]) = _CurrentQtrNo and [Year] = _CurrentYearNo then "Current Quarter"
else if Date.QuarterOfYear([Date]) = _CurrentQtrNo - 1 and [Year] = _CurrentYearNo then "Previous Quarter"
else if Date.QuarterOfYear([Date]) = _CurrentQtrNo + 1 and [Year] = _CurrentYearNo then "Next Quarter"
else if [Year] = _CurrentYearNo then "Current Year"
else if [Year] = _PreviousYear then "Previous Year"
else if [Year] = _CurrentYearNo + 1 then "Next Year"
else "Other_Periods"
, type text),
/* ================================
ToDate Buckets (WTD, MTD, QTD, YTD)
================================ */
_ToDateBuckets = Table.AddColumn(_FixedPeriodFlag, "ToDate_Ranges", each
let
_CurrentWeekNo = Date.WeekOfYear(_Today),
_CurrentMonthNo = Date.Month(_Today),
_CurrentQtrNo = Date.QuarterOfYear(_Today),
_CurrentYearNo = Date.Year(_Today)
in
if [Year] = _CurrentYearNo and [Week_Of_Year] = _CurrentWeekNo and [Date] <= _Today then "WeekToDate"
else if [Year] = _CurrentYearNo and [Month_No] = _CurrentMonthNo and [Date] <= _Today then "MonthToDate"
else if [Year] = _CurrentYearNo and Date.QuarterOfYear([Date]) = _CurrentQtrNo and [Date] <= _Today then "QuarterToDate"
else if [Year] = _CurrentYearNo and [Date] <= _Today then "YearToDate"
else "Other_Periods"
, type text)
in
_ToDateBuckets
#Result:
Rolling_Period_Flag1 =
VAR _TodayDate = TODAY()
RETURN
SWITCH (
TRUE(),
dim_Calendar[Date] = _TodayDate, "Today",
dim_Calendar[Date] = _TodayDate - 1, "Previous Day",
dim_Calendar[Date] >= _TodayDate - 7 &&
dim_Calendar[Date] <= _TodayDate, "Last 7 Days",
dim_Calendar[Date] >= _TodayDate - 7 &&
dim_Calendar[Date] <= _TodayDate, "Last 1 Week",
dim_Calendar[Date] >= EDATE(_TodayDate, -1) &&
dim_Calendar[Date] <= _TodayDate, "Last 1 Month",
dim_Calendar[Date] >= EDATE(_TodayDate, -3) &&
dim_Calendar[Date] <= _TodayDate, "Last 1 Quarter",
dim_Calendar[Date] >= EDATE(_TodayDate, -12) &&
dim_Calendar[Date] <= _TodayDate, "Last 1 Year",
dim_Calendar[Date] > _TodayDate &&
dim_Calendar[Date] <= _TodayDate + 7, "Next Week",
dim_Calendar[Date] > _TodayDate &&
dim_Calendar[Date] <= EDATE(_TodayDate, 1), "Next Month",
dim_Calendar[Date] > _TodayDate &&
dim_Calendar[Date] <= EDATE(_TodayDate, 3), "Next Quarter",
dim_Calendar[Date] > _TodayDate &&
dim_Calendar[Date] <= EDATE(_TodayDate, 12), "Next Year",
dim_Calendar[Date] > EDATE(_TodayDate, 12), "Future",
"Historical"
)
Fixed_Period_Flag1 =
VAR _TodayDate = TODAY()
VAR _CurrentYear = YEAR(_TodayDate)
VAR _PrevYear = _CurrentYear - 1
VAR _CurrentMonth = MONTH(_TodayDate)
VAR _CurrentQTR = QUARTER(_TodayDate)
VAR _CurrentWeek = WEEKNUM(_TodayDate, 1) -- 1 = Week starts Sunday
RETURN
SWITCH (
TRUE(),
dim_Calendar[Date] = _TodayDate, "Today",
dim_Calendar[Date] = _TodayDate + 1, "Next Day",
dim_Calendar[Week_Of_Year] = _CurrentWeek &&
dim_Calendar[Year] = _CurrentYear, "Current Week",
dim_Calendar[Week_Of_Year] = _CurrentWeek - 1 &&
dim_Calendar[Year] = _CurrentYear, "Previous Week",
dim_Calendar[Week_Of_Year] = _CurrentWeek + 1 &&
dim_Calendar[Year] = _CurrentYear, "Next Week",
dim_Calendar[Month_No] = _CurrentMonth &&
dim_Calendar[Year] = _CurrentYear, "Current Month",
dim_Calendar[Month_No] = _CurrentMonth - 1 &&
dim_Calendar[Year] = _CurrentYear, "Previous Month",
dim_Calendar[Month_No] = _CurrentMonth + 1 &&
dim_Calendar[Year] = _CurrentYear, "Next Month",
dim_Calendar[Qtr_No] = "Q" & _CurrentQTR &&
dim_Calendar[Year] = _CurrentYear, "Current Quarter",
dim_Calendar[Qtr_No] = "Q" & (_CurrentQTR - 1) &&
dim_Calendar[Year] = _CurrentYear, "Previous Quarter",
dim_Calendar[Qtr_No] = "Q" & (_CurrentQTR + 1) &&
dim_Calendar[Year] = _CurrentYear, "Next Quarter",
dim_Calendar[Year] = _CurrentYear, "Current Year",
dim_Calendar[Year] = _PrevYear, "Previous Year",
dim_Calendar[Year] = _CurrentYear + 1, "Next Year",
"Other_Periods"
)
ToDate_Ranges1 =
VAR _TodayDate = TODAY()
VAR _CurrentYear = YEAR(_TodayDate)
VAR _CurrentMonth = MONTH(_TodayDate)
VAR _CurrentQTR = QUARTER(_TodayDate)
VAR _CurrentWeek = WEEKNUM(_TodayDate, 1)
RETURN
SWITCH (
TRUE(),
dim_Calendar[Year] = _CurrentYear &&
dim_Calendar[Week_Of_Year] = _CurrentWeek &&
dim_Calendar[Date] <= _TodayDate, "WeekToDate",
dim_Calendar[Year] = _CurrentYear &&
dim_Calendar[Month_No] = _CurrentMonth &&
dim_Calendar[Date] <= _TodayDate, "MonthToDate",
dim_Calendar[Year] = _CurrentYear &&
dim_Calendar[Qtr_No] = "Q" & _CurrentQTR &&
dim_Calendar[Date] <= _TodayDate, "QuarterToDate",
dim_Calendar[Year] = _CurrentYear &&
dim_Calendar[Date] <= _TodayDate, "YearToDate",
"Other_Periods"
)
--------------------------------------------------------------------------------------------------------
Thanks, TAMATAM ; Business Intelligence & Analytics Professional
--------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------