PostgreSQL: форматировать интервал в минутах - PullRequest
24 голосов
/ 11 августа 2010

Когда я вычитаю метки времени, интервал имеет вид DD: HH: MM: SS. Как я могу преобразовать все в минуты без извлечения дней и часов и умножения / сложения ? Я ищу одну функцию, которую я могу заменить на date_part в этом запросе, чтобы он возвращал 65:

select date_part('minutes', '65 minutes'::interval);

Контекст: мне нужно знать, сколько минут прошло с заданной отметки времени.

Ответы [ 3 ]

49 голосов
/ 11 августа 2010
SELECT EXTRACT(EPOCH FROM '2 months 3 days 12 hours 65 minutes'::INTERVAL)/60;

кажется, работает.

ВНИМАНИЕ: "кажется" - ключевое слово.

0 голосов
/ 05 мая 2018

Как указывалось в предыдущем ответе, хитрость заключается в том, чтобы преобразовать интервал в «эпоху», то есть в абсолютное количество секунд, а затем соответствующим образом разделить абсолютные числа других единиц.

Соннесколько лет назад я написал 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;
0 голосов
/ 11 августа 2010

Я на самом деле не думаю, что вы можете сделать это без странных вещей (например, to_char), потому что минуты переворачиваются на 59. Вот почему вы получаете:

postgres=# select date_part('minutes', '65 minutes'::interval);
 date_part 
-----------
         5
(1 row)

postgres=# select '65 minutes'::interval
postgres-# ;
 interval 
----------
 01:05:00
(1 row)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...