Streamhub's product team is configuring trial period logic for the subscription platform. The 30-day free trial duration needs to be expressed as a time interval value so the system can calculate expiry dates from a signup timestamp.
Write a query to return the trial duration as an interval.
Output:
- A single row with one column,
trial_period, typed as an interval.
Run previews · Check grades
Write a query, then run it to see results here.
Worked solution Try it yourself first
SELECT
INTERVAL '30 days' AS trial_period The shape
The INTERVAL keyword turns the quoted duration into a real time-span value that the subscription platform can add to a signup timestamp to get an expiry date. The type comes before the value, not after — that's the type-prefixed literal form.
Clause by clause
SELECT INTERVAL '30 days'produces a singleintervalvalue representing thirty days of duration. TheINTERVALkeyword tells PostgreSQL to parse the quoted string as a duration; PostgreSQL accepts units likedays,hours,months,years, and combinations like'1 year 6 months'. The string is the spelling; the keyword is what gives it the type.AS trial_periodlabels the output column as the business field the trial-logic configuration reads.
Why this and not '30 days'::interval
Both shapes produce the same value. INTERVAL '30 days' is the type-prefixed literal form — the type name leads, the quoted value follows. '30 days'::interval is the cast form, identical in semantics. PostgreSQL recognises both, and either one is acceptable in production code.
The difference is stylistic. The INTERVAL prefix is how the SQL standard expects duration literals to be written and the spelling most documentation uses. The cast form is consistent with how every other type gets converted in PostgreSQL. Either is fine; pick one and use it consistently.
The trap
Write the duration as a plain string and PostgreSQL has no idea it's supposed to be a duration. SELECT '30 days' AS trial_period returns the literal text '30 days', which the platform can't add to a timestamp. Adding '30 days' to now() fails with a type-mismatch error because text + timestamp is not a defined operation. The INTERVAL keyword is what gives the value its duration meaning; its absence is the difference between a working expiry calculation and a stuck query.
You practiced producing an interval literal with the INTERVAL keyword. Intervals are first-class duration values that arithmetic operators understand — now() + INTERVAL '30 days' is how trial-expiry calculations work.