2009-06-04 9 views
85

Decir que tengo un intervalo como¿Cómo convierto un intervalo en un número de horas con postgres?

4 days 10:00:00 

en Postgres. ¿Cómo se convierte eso a un número de horas (? 106 en este caso) ¿Hay una función o debería morder la bala y hacer algo como

extract(days, my_interval) * 24 + extract(hours, my_interval) 
+3

Nota: Si el 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

Respuesta

167

Probablemente la forma más sencilla es:

SELECT EXTRACT(epoch FROM my_interval)/3600 
+6

Y tal vez el piso o el resultado en enteros si el intervalo contiene minutos y/o segundos – rasjani

+34

¿Extracto de época? Oh mi, eso no se me hubiera pasado por la cabeza en un millón de años. – agnul

+1

SELECCIONE EL EXTRACTO (epoch FROM my_interval/3600) (el intervalo tiene soporte nativo 'divide entero', el resultado es el intervalo, y el resultado del extracto es entero, no flotante). Asi que. Autocast/Piso hecho. – Offenso

12

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

SELECT (EXTRACT(epoch FROM (SELECT (NOW() - '2014-08-02 08:10:56')))/86400)::int 
+0

¡Genial! Gracias por eso :) Sin embargo, descubrí que ahora podemos modificar esto para que sea 'SELECT extract ('epoch' FROM age ('2014-08-02' :: timestamp))/86400' (estoy usando Pg 9.4), ya que 'age (ts)' usa automáticamente 'CURRENT_DATE' cuando solo hay un argumento. – 1111161171159459134

+0

Advertencia: simplemente la extracción de la época supone implícitamente que un mes = 30 días y un año = 365.25 días. – Teddy

-2
  select date 'now()' - date '1955-12-15'; 

Ésta es la consulta sencilla que calcula total de ninguna de días.

+2

Eso no toma un valor de intervalo. – Teddy

3

para obtener el número de días que la forma más sencilla sería:

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

Por lo que yo sabía que iba a devolver el mismo que:

SELECT (EXTRACT(epoch FROM (SELECT (NOW() - '2014-08-02 08:10:56')))/86400)::int; 
+7

Si su intervalo es ''1 mes 0 días'', usar' extract (day from ...) 'le dará' 0' como resultado. – Underyx

0

Si convierte campo de tabla:

  1. Define el campo por lo que contiene segundos: CREATE TABLE IF NOT EXISTS test ( ... field INTERVAL SECOND(0) );
  2. Extraiga el valor. Recuerde echar a int de otra forma se puede obtener una sorpresa desagradable una vez que los intervalos son grandes: EXTRACT(EPOCH FROM field)::int
Cuestiones relacionadas