Como converter um intervalo como "1 dia 01:30:00" em "25:30:00"?

votos
17

Eu preciso adicionar alguns intervalos e usar o resultado em Excel.

Desde a

sum(time.endtime-time.starttime)

retorna o intervalo como 1 dia 01:30:00 e esse formato de quebra minha folha de Excel, eu pensei que seria bom ter a saída como 25:30:00, mas não encontrou nenhuma maneira de fazê-lo no PostgreSQL documentação.

Alguém aqui pode me ajudar?

Publicado 04/12/2008 em 18:16
fonte usuário
Em outras línguas...                            


6 respostas

votos
21

A única coisa que pode vir com (ao lado de analisar o número de dias e adicionando 24 para as horas de cada vez) é:

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

Ele lhe dará o número de segundos, que pode ser ok para excel.

Respondeu 04/12/2008 em 18:30
fonte usuário

votos
18

Você pode usar EXTRACTpara converter o intervalo em segundos.

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

Então você precisa fazer suas próprias matemática (ou deixar Excel fazê-lo).

Note-se que 'um dia' não é necessariamente equivalente a '24 horas - PostgreSQL lida com coisas como um intervalo que se estende por uma transição DST.

Respondeu 04/12/2008 em 18:35
fonte usuário

votos
0

No padrão SQL, que pretende representar o tipo de hora de intervalo PARA SEGUNDA, mas você tem um valor do tipo INTERVAL DAY TO SECOND. você não pode usar um CAST para chegar ao seu resultado desejado? Em Informix, a notação seria qualquer um:

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

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

O anterior é, AFAIK, notação Informix-específico (ou, pelo menos, não padrão); o último é, creio eu, notação padrão SQL.

Respondeu 04/12/2008 em 18:47
fonte usuário

votos
0

Isso pode ser feito, mas eu acredito que a única maneira é através do seguinte monstruosidade (assumindo que o seu tempo de nome da coluna intervalo é "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;

Vejo? Eu lhe disse que era horrível :)

Teria sido bom pensar que

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

teria trabalhado, mas, infelizmente, o formato HH24 não "absorver" o transbordamento além 24. O acima vem (reconstruída a partir da memória) a partir de um código, uma vez que eu escrevi. Para evitar ofender aqueles de constituição delicada, I encapsulado as travessuras acima em uma visão ...

Respondeu 09/12/2008 em 00:19
fonte usuário

votos
12

Se você queria postgres para lidar com a HH: MM: SS formatação para você, tome a diferença em segundos época e convertê-lo em um intervalo escalado em segundos:

SELECT SUM(EXTRACT(EPOCH FROM time.endtime) - EXTRACT(EPOCH FROM time.starttime))
         * INTERVAL '1 SECOND' AS hhmmss
Respondeu 16/06/2011 em 20:29
fonte usuário

votos
15

Uma vez que não é uma solução exata para o tópico:

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

Fonte: Documentação

Respondeu 23/06/2014 em 11:01
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more