Search code examples
postgresqldate-range

Select a part from the daterange column type


Maybe there is a function?

SELECT min('[2010-01-01, 2010-02-01)'::daterange); Should return: '2010-01-01'

SELECT max('[2010-01-01, 2010-02-01)'::daterange); Should return: '2010-01-31'


Solution

  • No, but you could use upper_inc, upper, lower_inc, lower functions to write such a function:

    WITH dr AS (
      SELECT '[2010-01-01, 2010-02-01)'::daterange r
    ), t AS (
      SELECT r, lower_inc(r) li, upper_inc(r) ui, lower(r) l, upper(r) u FROM dr
    )
    SELECT CASE WHEN li THEN l ELSE l + INTERVAL '1 DAY' END AS "range_minimum"
         , CASE WHEN ui THEN u ELSE u - INTERVAL '1 DAY' END AS "range_maximum"
    FROM t;