Как преобразовать интервал типа «1 день 01:30:00» в «25:30:00»? - PullRequest
20 голосов
/ 04 декабря 2008

Мне нужно добавить несколько интервалов и использовать результат в Excel.

С

sum(time.endtime-time.starttime)

возвращает интервал как «1 день 01:30:00», и этот формат разбивает мой лист Excel, я подумал, что было бы неплохо иметь вывод как «25:30:00», но не нашел способа сделать это в документации PostgreSQL.

Может ли кто-нибудь здесь помочь мне?

Ответы [ 6 ]

21 голосов
/ 04 декабря 2008

Единственное, с чем я могу прийти (кроме анализа количества дней и добавления 24 к часам каждый раз):

mat=> select date_part('epoch', '01 day 1:30:00'::interval);
 date_part 
-----------
     91800
(1 row)

Это даст вам количество секунд, которое может быть хорошо для Excel.

18 голосов
/ 23 июня 2014

Так как нет точного решения по теме:

=> SELECT date_part('epoch', INTERVAL '1 day 01:30:00') * INTERVAL '1 second' hours;
  hours
-----------
 25:30:00
(1 row)

Источник: Документация

18 голосов
/ 04 декабря 2008

Вы можете использовать EXTRACT для преобразования интервала в секунды.

SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours');
Result: 442800

Тогда вам нужно будет сделать свою математику (или позволить Excel сделать это).

Обратите внимание, что «1 день» не обязательно эквивалентен «24 часам» - PostgreSQL обрабатывает такие вещи, как интервал, охватывающий переход DST.

12 голосов
/ 16 июня 2011

Если вы хотите, чтобы postgres обрабатывал для вас форматирование HH: MM: SS, возьмите разницу в секундах эпохи и преобразуйте ее в интервал, масштабированный в секундах:

SELECT SUM(EXTRACT(EPOCH FROM time.endtime) - EXTRACT(EPOCH FROM time.starttime))
         * INTERVAL '1 SECOND' AS hhmmss
0 голосов
/ 09 декабря 2008

Это можно сделать, но я полагаю, что единственный способ - через следующее чудовище (при условии, что ваше имя столбца временного интервала - "ti"):

select
              to_char(floor(extract(epoch from ti)/3600),'FM00')
    || ':' || to_char(floor(cast(extract(epoch from ti) as integer) % 3600 / 60), 'FM00')
    || ':' || to_char(cast(extract(epoch from ti) as integer) % 60,'FM00')
    as hourstamp
from whatever;

См? Я же говорил, это было ужасно :) 1004 *

Было бы неплохо подумать, что

select to_char(ti,'HH24:MI:SS') as hourstamp from t

сработало бы, но, увы, формат HH24 не "поглощает" переполнение за пределами 24. Вышеприведенное (воссоздано по памяти) происходит из некоторого кода, который я когда-то написал. Чтобы не оскорбить деликатных телосложений, я инкапсулировал вышеуказанные махинации с целью ...

0 голосов
/ 04 декабря 2008

В стандартном SQL вы хотите представить тип как INTERVAL HOUR TO SECOND, но у вас есть значение типа INTERVAL DAY TO SECOND. Разве вы не можете использовать CAST, чтобы получить желаемый результат? В Informix нотация будет одной из:

SUM(time.endtime - time.starttime)::INTERVAL HOUR(3) TO SECOND

CAST(SUM(time.endtime - time.starttime) AS INTERVAL HOUR(3) TO SECOND)

Первая, AFAIK, специфичная для Informix нотация (или, по крайней мере, не стандартная); последняя, ​​я считаю, стандартная запись SQL.

...