AdvancedAdvanced PostgreSQL

PostgreSQL-specific: range types

The query

SQL
-- Range types: very powerful PostgreSQL feature
SELECT
  '[1, 10]'::int4range AS inclusive_range,
  '(1, 10)'::int4range AS exclusive_range,
  '[2024-01-01, 2024-12-31]'::daterange AS date_range;

-- Check overlaps, containment
SELECT
  '[1,10]'::int4range @> 5 AS contains_5,
  '[1,5]'::int4range && '[3,8]'::int4range AS overlaps,
  '[1,5]'::int4range + '[4,8]'::int4range AS union_range;

-- Find overlapping project schedules
SELECT p1.name, p2.name
FROM projects p1
JOIN projects p2 ON p1.project_id < p2.project_id
  AND daterange(p1.start_date, p1.end_date) && daterange(p2.start_date, p2.end_date);
Tested against PostgreSQL 16

Note

Range types: int4range, int8range, numrange, tsrange, daterange. @> = contains, && = overlaps, + = union.

Tables referenced