2008-12-04 8 views
16

Мне нужно добавить несколько интервалов и использовать результат в Excel.Как конвертировать интервал как «1 день 01:30:00» в «25:30:00»?

С

sum(time.endtime-time.starttime) 

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

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

ответ

14

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

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

Источник: Documentation

21

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

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

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

+0

Большой материал.Мне нужен был какой-то способ абстрагироваться от интервала, и первым шагом, который мне был нужен, был «отбросить» интервал до секунд, и это просто сделало трюк :) «SELECT * FROM table ORDER BY abs (date_part ('epoch', ('2011-07-19 02:40:05' - table.time))) ` – Boro 2012-12-19 09:51:04

18

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

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

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

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

+1

В (временная метка | дата | время) с часовым поясом, да, но, гул, интервал не имеет понятия о том, когда это происходит , поэтому он не имеет значения перехода на летнее время или значения прыжка. – mat 2008-12-04 17:37:50

+0

osm => select '2008-03-29T02: 00: 05 + 0200' :: timestamptz + '1 день' :: interval; ? Колонка? ------------------------ 2008-03-30 01: 00: 05 + 01 (1 ряд) – mat 2008-12-04 17:39:56

+3

Я не могу быть авторитетным по сути, но кажется, что Postgres сохраняет интервал как набор полей, а не просто целое число, преобразованное для отображения. Он будет интерпретироваться как другое количество секунд в зависимости от того, где он применяется. Разграбление контекста означает, что он должен делать предположения. – slim 2008-12-04 17:47:55

0

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

0

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

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. Выше идет (реконструирован из памяти) из некоторого кода, который я когда-то писал. Чтобы избежать оскорбления тонкой конституции, я инкапсулировал вышеизложенные махинации в ...

11

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

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