2009-06-04 11 views
85

che ho un intervallo comeCome posso convertire un intervallo in un numero di ore con Postgres?

4 days 10:00:00 

in postgres. Come faccio a convertire che, per un numero di ore (? 106 in questo caso) C'è una funzione o dovrei stringere i denti e fare qualcosa di simile

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

Nota: se l'intervallo contiene mesi o anni, non c'è una risposta definita di quante ore ci sono, poiché il numero di giorni in un mese o anno varia. Quindi attenzione! – Teddy

risposta

167

Probabilmente il modo più semplice è:

SELECT EXTRACT(epoch FROM my_interval)/3600 
+6

E forse floor o cast il risultato in numero intero se l'intervallo contiene minuti e/o secondi – rasjani

+34

Extract epoch? Oh mio Dio, non mi sarebbe passato per la testa tra un milione di anni. – agnul

+1

SELEZIONA ESTRATTO (epoca FROM mio_intervallo/3600) (l'intervallo ha il supporto 'intero intero' nativo, il risultato è l'intervallo e il risultato dell'estrazione è intero, non mobile). Così. Autocast/Piano fatto. – Offenso

12

Se volete intero cioè il numero di giorni:

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

Ottimo! Grazie per quello :) Eppure, ho scoperto che ora possiamo modificare questo per essere 'SELECT extract ('epoch' FROM age ('2014-08-02' :: timestamp))/86400' (Sto usando Pg 9.4), poiché 'age (ts)' usa automaticamente 'CURRENT_DATE' quando un solo argomento. – 1111161171159459134

+0

Attenzione: la semplice estrazione dell'epoca presuppone implicitamente che un mese = 30 giorni e un anno = 365,25 giorni. – Teddy

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

Ecco la semplice query che calcola totale non di giorni.

+2

Ciò non richiede un valore di intervallo. – Teddy

3

Per ottenere il numero di giorni il modo più semplice potrebbe essere:

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

Per quanto ne so che sarebbe tornato lo stesso di:

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

Se il tuo intervallo è ''1 mese 0 giorni'', usando' estrai (giorno da ...) 'otterrai' 0' come risultato. – Underyx

0

Se si converte campo della tabella:

  1. Definire il campo in modo che contenga i secondi: CREATE TABLE IF NOT EXISTS test ( ... field INTERVAL SECOND(0) );
  2. Estrarre il valore. Ricordati di lanciare a int altro saggio si può ottenere una brutta sorpresa una volta che gli intervalli sono grandi: EXTRACT(EPOCH FROM field)::int