Learn SQL/Intermediate/Date & Time/SQL DATE_TRUNC by Year

SQL DATE_TRUNC by Year

Rounds down to January 1st of the same year — useful for grouping records into yearly buckets.

What & Why

DATE_TRUNC('year', date_column) zeroes out everything except the year, landing on January 1st at midnight. Grouping by this expression buckets every record into its calendar year.

See How It Works

BUSINESS QUESTION

Growth wants annual signup totals.

idcreated_atcountrychannelplanactivated_atchurned_at
1012024-01-15 09:10:00+00USorganicpro2024-01-16 14:25:00+00NULL
1022024-02-10 11:05:00+00CApaidfreeNULL2024-03-20 10:00:00+00
1032024-03-12 16:35:00+00GBreferralpro2024-03-13 08:15:00+00NULL
1042024-04-01 13:20:00+00USorganicfree2024-04-03 12:00:00+00NULL
EXAMPLE QUERY
SELECT
  DATE_TRUNC('year', created_at)::date AS signup_year,
  COUNT(*) AS signups
FROM growth.users
GROUP BY signup_year
ORDER BY signup_year;
RESULT — exact output from the displayed Queryflo rows
signup_yearsignups
2024-01-014

DATE_TRUNC maps every displayed signup to the same year boundary.

Now You Try

Practice this concept

Growth wants annual signup totals.

Available schema
growth

Prefix tables with growth.table_name.

signup_yearsignups
growth.users
ColumnType
idinteger
created_attimestamp with time zone
countrytext
channeltext
plantext
activated_attimestamp with time zone
churned_attimestamp with time zone
legacy_user_codetext
query.sql
Intermediate business practice

Sign up free to try it on a real business scenario