to_char postgres number interval example ejemplos ejemplo date_part postgresql formatting intervals

number - timestamp postgresql ejemplo



¿Cómo convertir un intervalo como "1 día 01:30:00" en "25:30:00"? (6)

En SQL estándar, quiere representar el tipo INTERVAL HOUR TO SECOND, pero tiene un valor de tipo INTERVAL DAY TO SECOND. ¿No puedes usar un CAST para llegar a tu resultado requerido? En Informix, la notación sería cualquiera 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 específica de Informix (o, al menos, no estándar); el último es, creo, la notación estándar SQL.

Necesito agregar algunos intervalos y usar el resultado en Excel.

Ya que

sum(time.endtime-time.starttime)

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

¿Puede alguien aquí ayudarme?


Lo único que puedo ofrecer (además de analizar el número de días y agregar 24 a las horas cada vez) es:

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

Le dará la cantidad de segundos, lo que puede estar bien para sobresalir.


Puede usar EXTRACT para convertir el intervalo en segundos.

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

Entonces necesitarías hacer tus 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.


Se puede hacer, pero creo que la única forma es a través de la siguiente monstruosidad (suponiendo que el nombre de columna de intervalo de tiempo 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 fue horrible :)

Hubiera sido bueno pensar que

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

funcionaría, pero, por desgracia, el formato HH24 no "absorbe" el desbordamiento más allá de 24. Lo anterior viene (reconstruido a partir de la 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 ...


Si desea que postgres maneje el formato HH: MM: SS, tome la diferencia en segundos de época y conviértala a un intervalo de escala en segundos:

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


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: Documentación