A Brightlane data analyst is investigating why a year-over-year report is collapsing records from March 2024 and March 2023 into a single group. The grouping logic relies on the month component pulled out of the event date.
Write a query to return the month component of '2024-03-15' and the month component of '2023-03-15' in a single row.
Output:
- A single row with columns
month_2024andmonth_2023, each containing the month number from the corresponding date.
Schema · ecommerce 5 tables
Run previews · Check grades
Write a query, then run it to see results here.
Worked solution Try it yourself first
SELECT
EXTRACT(
MONTH
FROM
'2024-03-15'::date
) AS month_2024,
EXTRACT(
MONTH
FROM
'2023-03-15'::date
) AS month_2023 The shape
EXTRACT(month FROM ...) returns a number between 1 and 12 with no year component attached, so two dates that share a month but belong to different years return the same number. The March 15 dates from 2024 and 2023 both return 3. The analyst's year-over-year report keys on this value, which is why the two periods collapse into a single group.
Clause by clause
SELECT EXTRACT(month FROM '2024-03-15'::date) AS month_2024returns the month component of the 2024 date as the number3. The::datecast resolves the string as a calendar date, andEXTRACTreads the month off it.EXTRACT(month FROM '2023-03-15'::date) AS month_2023does the same against the 2023 date. The cast and the extraction are identical; only the year inside the literal differs.- There is no
FROMbecause both expressions evaluate against literals directly. Putting them side by side in the same row makes the equality visible at a glance: the two columns both show3.
Why EXTRACT(month ...) produces the same value across years
EXTRACT is a decomposition tool. Its job is pulling one named component out of a datetime, and the month component of any March date is 3 regardless of which year the date belongs to. The year is a separate component, accessible through EXTRACT(year FROM ...). A report that needs both pieces has to extract them both and key on the pair, or, more commonly, use DATE_TRUNC('month', ...) instead. DATE_TRUNC('month', ...) returns a full timestamp like '2024-03-01 00:00:00' that includes the year inside the boundary value, which keeps March 2024 and March 2023 in separate groups.
The trap
The collapse is silent. Both dates extract to 3, both rows survive every downstream lookup that keys on the month number, and the year-over-year report shows what looks like a doubled total for March with no warning. The analyst's instinct, when seeing two periods merge, is to look for a join or a filter that's misbehaving; the actual cause is the extraction discarding the year on every row at the start of the pipeline. The rule is general: EXTRACT(month ...) is the right tool when the question is which month of the year a single datetime falls in, and the wrong tool whenever the question spans more than one year.
You practiced EXTRACT(month FROM ...) returning the same month number across years — the recurring source of a year-over-year report that collapses two calendar periods into one bucket.