Подтвердить что ты не робот

Как конвертировать интервал как "1 день 01:30:00" в "25:30:00"?

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

Так как

sum(time.endtime-time.starttime)

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

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

4b9b3361

Ответ 1

Поскольку не существует точного решения для темы:

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

SELECT SUM(EXTRACT(EPOCH FROM time.endtime) - EXTRACT(EPOCH FROM time.starttime))
         * INTERVAL '1 SECOND' AS hhmmss

Ответ 5

В стандартном 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.

Ответ 6

Это можно сделать, но я считаю, что единственный способ заключается в следующем чудовище (при условии, что ваше имя столбца временного интервала "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;

См? Я сказал вам, что это ужасно:)

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

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

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