¿Cómo convierto un intervalo en varias horas con postgres?

161

Digamos que tengo un intervalo como

4 days 10:00:00

en postgres. ¿Cómo convierto eso en varias horas (106 en este caso?) ¿Hay una función o debo morder la bala y hacer algo como

extract(days, my_interval) * 24 + extract(hours, my_interval)
agnul
fuente
9
Nota: Si su intervalo contiene meses o años, no hay una respuesta definida de cuántas horas hay, ya que la cantidad de días en un mes o año varía. ¡Así que ten cuidado con eso!
Teddy

Respuestas:

313

Probablemente la forma más fácil es:

SELECT EXTRACT(epoch FROM my_interval)/3600
Magnus Hagander
fuente
66
Y tal vez suelo o emitir el resultado al número entero si el intervalo contiene minutos y / o segundos
rasjani
64
Extraer época? Oh, eso no me habría pasado por la cabeza en un millón de años.
agosto
44
SELECT EXTRACT (epoch FROM my_interval / 3600) (el intervalo tiene soporte nativo para 'dividir entero', el resultado es intervalo y el resultado de extracción es entero, no flotante). Entonces. Autocast / piso hecho.
Offenso
19
Advertencia: simplemente extraer época implícitamente supone que un mes = 30 días y un año = 365.25 días.
Teddy
@Teddy, ¿qué podemos hacer con él? ¿Cómo evitar este problema y obtener un número real de épocas?
Asmox
18

Si quieres entero, es decir, número de días:

SELECT (EXTRACT(epoch FROM (SELECT (NOW() - '2014-08-02 08:10:56')))/86400)::int
Pujan Srivastava
fuente
¡Excelente! Gracias por eso :) Sin embargo, descubrí que ahora podemos modificar esto SELECT extract('epoch' FROM age('2014-08-02'::timestamp)) / 86400(estoy usando la página 9.4), ya que age(ts)automáticamente lo uso CURRENT_DATEcuando solo hay un argumento.
1111161171159459134
77
Advertencia: simplemente extraer época implícitamente supone que un mes = 30 días y un año = 365.25 días.
Teddy
3

Para obtener la cantidad de días, la forma más fácil sería:

SELECT EXTRACT(DAY FROM NOW() - '2014-08-02 08:10:56');

Hasta donde sé, devolvería lo mismo que:

SELECT (EXTRACT(epoch FROM (SELECT (NOW() - '2014-08-02 08:10:56')))/86400)::int;
belveryin
fuente
27
Si su intervalo es '1 month 0 days', el uso extract(day from …)le dará 0como resultado.
Underyx
1
select floor((date_part('epoch', order_time - '2016-09-05 00:00:00') / 3600)), count(*)
from od_a_week
group by floor((date_part('epoch', order_time - '2016-09-05 00:00:00') / 3600));

La ::intconversión sigue el principio de redondeo. Si desea un resultado diferente, como redondear hacia abajo, puede utilizar la función matemática correspondiente, como floor.

haoming
fuente
1

Si convierte el campo de tabla:

  1. Defina el campo para que contenga segundos:

     CREATE TABLE IF NOT EXISTS test (
         ...
         field        INTERVAL SECOND(0)
     );
  2. Extrae el valor. Recuerde enviar a int de otra manera puede obtener una sorpresa desagradable una vez que los intervalos son grandes:

    EXTRACT(EPOCH FROM field)::int

Janek Olszak
fuente
No creo que Redshift sea compatible con el tipo de datos INTERVAL. Sería simplemente GRANDE.
matt2000
-4
         select date 'now()' - date '1955-12-15';

Aquí está la consulta simple que calcula el total de días.

Arunkumar Papena
fuente
44
Eso no toma un valor de intervalo.
Teddy