Как указывалось в предыдущем ответе, хитрость заключается в том, чтобы преобразовать интервал в «эпоху», то есть в абсолютное количество секунд, а затем соответствующим образом разделить абсолютные числа других единиц.
Соннесколько лет назад я написал interval_convert
функцию , которая обобщает это для большинства аргументов, принятых date_part
, предполагая, что месяц равен 30 дням, а год - 365,25 дня.
Не стесняйтесь использовать и изменять по своему усмотрению:
CREATE FUNCTION
interval_convert(in_unit text, in_interval interval)
RETURNS double precision
AS $FUNC$
SELECT
EXTRACT(
EPOCH FROM
$2 -- in_interval
)
/
-- Slightly lazy way of allowing both singular and plural
-- has side effect that 'centurie' and 'centurys' are accepted
-- but otherwise behaves similarly to DATE_TRUNC
CASE TRIM(TRAILING 's' FROM LOWER(
$1 -- in_unit
))
WHEN 'microsecond' THEN 0.000001
WHEN 'millisecond' THEN 0.001
WHEN 'second' THEN 1
WHEN 'minute' THEN 60
WHEN 'hour' THEN 3600
WHEN 'day' THEN 86400
WHEN 'week' THEN 604800
WHEN 'month' THEN 2592000 -- 30 days
-- WHEN 'quarter' THEN -- Not supported
WHEN 'year' THEN 31557600 -- 365.35 days
WHEN 'decade' THEN 315576000
WHEN 'century' THEN 3155760000
WHEN 'centurie' THEN 3155760000
WHEN 'millennium' THEN 31557600000
WHEN 'millennia' THEN 31557600000
END
$FUNC$
LANGUAGE sql
IMMUTABLE
RETURNS NULL ON NULL INPUT;