Tableau / Intermediate: calculation and interaction scope / Lesson 10
Dates, period grain and calendar policy
Keep date parts, truncated date values and business-calendar rules distinct when building trends and comparisons.
On this page
Lesson goals
- Compare month-of-year grouping with year-month grouping.
- Define time-zone and week/fiscal assumptions.
- Review incomplete and missing periods explicitly.
Choose part or date value
A month date part can combine all Januaries, while a truncated month date value distinguishes January 2025 from January 2026. Both can be useful for different questions: seasonality versus a continuous multi-year timeline. The field’s discrete/continuous representation adds another choice. State grouping and date role before interpreting a trend. A label such as January does not reveal which years contributed. The first snippet contrasts the two expressions without creating fields. Date functions change analytical values; formatting changes how a value appears and cannot by itself repair a mistaken grouping key.
// Month-of-year number
DATEPART('month', [Order Date])
// Year-month date value
DATETRUNC('month', [Order Date])
The first can group the same month across years; the second retains the year. These are separate field expressions, not an executed script.
Define calendar boundaries
Week start, ISO week-year behavior and fiscal-year rules are business definitions, not decorative labels. A date near New Year can belong to a different week-year than its calendar year under an ISO convention. Confirm source/date properties and function arguments against the selected calendar. Do not call every seven-day grouping an ISO week. Order date and shipment date also answer different questions. Name the role and test a transaction spanning a month or year boundary so a familiar axis label cannot hide a different population. Avoid assuming local system defaults match the organization’s reporting calendar.
Normalize time before period assignment
A UTC event late on January 31 can belong to February 1 in another time zone. Decide whether reporting follows event UTC, a business zone or a stored local date before extracting month. A source timestamp may already be normalized, so applying another offset can be equally wrong. The second program demonstrates a fixed UTC+02 example using timezone-aware values. It is not a general daylight-saving conversion policy or a Tableau connector test. Real named zones and historical rules need a supported preparation design, with explicit treatment of ambiguous or missing local times.
from datetime import datetime, timezone, timedelta
event = datetime(2026, 1, 31, 23, 30, tzinfo=timezone.utc)
local = event.astimezone(timezone(timedelta(hours=2)))
print(event.date())
print(local.date())
2026-01-31
2026-02-01
The same instant has dates 2026-01-31 and 2026-02-01 under the stated fixed zones. No Tableau or external time service is used.
Compare like periods and coverage
A current month with two loaded days is not automatically comparable with a complete prior month. Define elapsed-day matching, complete-period selection or another approved cutoff. Relative-date and latest-date concepts can depend on different reference points, so document whether the clock or the data’s latest usable date drives the view. A no-sale day differs from a missing extraction day. Show coverage and freshness alongside the trend rather than silently filling gaps. A date filter that selects the right labels cannot prove all expected source events have arrived or that late corrections were included.
Review calendar edge cases
Test two Januaries, a month boundary, a week-year boundary, a relevant leap day and an incomplete current period. Confirm role, time zone and sorting for each expected result. This course executes only the fixed-zone date calculation and creates no Tableau calendar or field. Actual date parsing, connector functions and fiscal properties remain untested. A useful handoff distinguishes raw timestamp, reporting date, date part, date value and displayed format, so another analyst can reproduce the intended population without relying on a screenshot or a local machine’s unstated defaults.
Common errors and fixes
All Januaries merge in a multi-year trend unintentionally
- Why it happens
- Month date part replaced a year-month key.
- How to fix it
- Choose the date value/grain matching the timeline question.
- Prevent it next time
- Keep two same-month different-year observations in review.
A boundary event enters the wrong business month
- Why it happens
- Time-zone normalization happened after grouping or was applied twice.
- How to fix it
- Define raw and reporting-time contracts before period extraction.
- Prevent it next time
- Test an event crossing midnight in the business zone.
Incomplete current data is compared with a full prior period
- Why it happens
- Coverage and cutoff rules were not stated.
- How to fix it
- Apply the approved like-period rule and expose data freshness.
- Prevent it next time
- Record usable-data cutoff with date-comparison measures.
Check your understanding
1. When is month-of-year grouping useful, and when is it misleading?
Show worked solution
It can compare seasonality across years deliberately. It misleads when the reader expects a chronological sequence of distinct year-month periods. Name the question and keep year in the date value or grouping when needed; changing axis formatting alone does not restore the discarded grouping distinction.
2. Why is adding a fixed two-hour offset not a universal time-zone strategy?
Show worked solution
Named zones can change offsets historically and with daylight-saving rules, and the source may already be normalized. The example proves one instant under fixed offsets only. Define the supported zone conversion and ambiguous-time policy upstream before deriving reporting dates for a production model.
Key takeaways
- Date part, date value and display format carry different contracts.
- Calendar, role, zone and coverage define meaningful time comparisons.