SQL AGE

Computes a human-friendly 'X years, Y months, Z days' breakdown between two dates — more readable than a raw day count for long spans.

What & Why

AGE(later, earlier) returns a calendar-aware interval in years, months, days, and time. User 102 uses the real churned_at value; active users use the fixed April 30, 2024 teaching boundary.

See How It Works

BUSINESS QUESTION

Growth wants observed account age from signup until churn, or until 2024-04-30 for active users.

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
  id AS user_id,
  AGE(COALESCE(churned_at, TIMESTAMPTZ '2024-04-30 00:00:00+00'), created_at) AS account_age
FROM growth.users
ORDER BY user_id;
RESULT — exact output from the displayed Queryflo rows
user_idaccount_age
1013 mons 14 days 14:50:00
1021 mon 9 days 22:55:00
1031 mon 17 days 07:25:00
10428 days 10:40:00

AGE uses churn for user 102 and the fixed 2024-04-30 boundary for active users.

Now You Try

Practice this concept

Return account age for every user, ending at churned_at when present and otherwise at the fixed 2024-04-30 teaching timestamp.

Available schema
growth

Prefix tables with growth.table_name.

user_idaccount_age
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