2008-12-04 13 views
16

Necesito agregar algunos intervalos y usar el resultado en Excel.¿Cómo convertir un intervalo como "1 día 01:30:00" a "25:30:00"?

Desde

sum(time.endtime-time.starttime) 

devuelve el intervalo como "1 day 01:30:00" y este formato me rompe hoja de Excel, pensé que sería bueno tener la salida como "25:30: 00 "pero no encontró forma de hacerlo en la documentación de PostgreSQL.

¿Alguien puede ayudarme?

Respuesta

14

Dado que no hay una solución exacta para el tema:

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

Fuente: Documentation

+0

¡Genial! Solución ideal. –

21

La única cosa que puedo venir con (al lado de analizar el número de días y añadiendo 24 a las horas cada vez) es:

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

se le dará el número de segundos, que puede estar bien para sobresalir.

+0

Gran materia.Necesitaba alguna forma de tomar un absoluto de un intervalo y el primer paso que necesitaba era 'convertir' el intervalo en segundos y esto acaba de hacer el truco :) 'SELECCIONAR * DE la tabla PEDIR POR abs (date_part ('época', ('2011-07-19 02:40:05' - table.time))) ' – Boro

18

Puede usar EXTRACT para convertir el intervalo en segundos.

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

Luego tendría que hacer sus propias matemáticas (o dejar que Excel lo haga).

Tenga en cuenta que '1 día' no es necesariamente equivalente a '24 horas '- PostgreSQL maneja cosas como un intervalo que abarca una transición DST.

+1

En un (timestamp | date | time) con zona horaria, sí, pero, hum, un intervalo no tiene noción de cuándo está sucediendo , por lo tanto, no tiene una transición DST o un significado de segundos intercalares. – mat

+0

osm => seleccionar '2008-03-29T02: 00: 05 + 0200' :: timestamptz + '1 day' :: interval; ? Column? ------------------------ 2008-03-30 01: 00: 05 + 01 (1 fila) – mat

+3

No puedo ser autoritario al respecto, pero parece que Postgres almacena el intervalo como un conjunto de campos, no solo como un entero que se convierte para mostrar. Se interpretará como una cantidad diferente de segundos según el lugar donde se aplique. Robarlo de contexto significa que debe hacer suposiciones. – slim

0

En SQL estándar, desea representar el tipo INTERVAL HORA A SEGUNDO, pero tiene un valor de tipo INTERVAL DÍA A SEGUNDO. ¿No puedes usar un CAST para llegar a tu resultado requerido? En Informix, la notación sería o bien de:

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

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

El primero es, AFAIK, notación Informix-específico (o, al menos, estándar no); el último es, creo, la notación estándar SQL.

0

Se puede hacer, pero creo que la única manera es a través de la siguiente monstruosidad (asumiendo que su tiempo de intervalo nombre de la columna es "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; 

ver? Te dije que era horrible :)

Hubiera sido agradable pensar que

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

habría trabajado, pero por desgracia, el formato HH24 no "absorber" el desbordamiento allá de 24. Lo anterior viene (reconstruido de memoria) de algún código que una vez escribí. Para evitar ofender a aquellos de constitución delicada, encapsulé las travesuras anteriores en una vista ...

11

Si quería que postgres manejara el formato HH: MM: SS, tome la diferencia en segundos de época y conviértala a escala de intervalos en segundos:

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

Muy sutil. Esto cambia el intervalo de días, horas, minutos, segundos a segundos, luego de lo cual puede hacer 'to_char (xxx, 'HH24: MI: SS')'. – sayap

+0

+1 Debería ser la respuesta ... agrégalo a mi nz cheat sheet –

Cuestiones relacionadas