Come faccio a convertire un intervallo in un numero di ore con Postgres?


161

Di 'che ho un intervallo come

4 days 10:00:00

in postgres. Come posso convertirlo in un numero di ore (106 in questo caso?) Esiste una funzione o devo mordere il proiettile e fare qualcosa di simile

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

9
Nota: se l'intervallo contiene mesi o anni, non esiste una risposta definita per quante ore ci sono, poiché il numero di giorni in un mese o anno varia. Quindi stai attento!
Teddy,

Risposte:


314

Probabilmente il modo più semplice è:

SELECT EXTRACT(epoch FROM my_interval)/3600

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

64
Estrarre epoca? Oh mio Dio, non mi sarebbe passato per la testa in un milione di anni.
agnul

5
SELEZIONA ESTRATTO (epoca DA my_interval / 3600) (l'intervallo ha il supporto nativo "divide intero", il risultato è intervallo e il risultato dell'estrazione è intero, non float). Così. Autocast / Piano fatto.
Offenso,

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

@Teddy cosa possiamo farci? Come evitare questo problema e ottenere il numero reale di epoche?
Asmox,

18

Se si desidera un numero intero, ovvero il numero di giorni:

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

Grande! Grazie per quello :) Eppure, ho scoperto che ora possiamo modificarlo per essere SELECT extract('epoch' FROM age('2014-08-02'::timestamp)) / 86400(sto usando Pg 9.4), dato che age(ts)uso automaticamente CURRENT_DATEquando solo un argomento.
1111161171159459134,

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

3

Per ottenere il numero di giorni il modo più semplice sarebbe:

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

Per quanto ne so, restituirebbe lo stesso di:

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

28
Se il tuo intervallo è '1 month 0 days', l'utilizzo extract(day from …)ti darà 0come risultato.
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 ::intconversione segue il principio di arrotondamento. Se si desidera un risultato diverso come arrotondamento per difetto, è possibile utilizzare la funzione matematica corrispondente come floor.


1

Se converti il ​​campo tabella:

  1. Definisci il campo in modo che contenga secondi:

     CREATE TABLE IF NOT EXISTS test (
         ...
         field        INTERVAL SECOND(0)
     );
  2. Estrai il valore. Ricorda di lanciare un altro saggio che puoi ottenere una spiacevole sorpresa quando gli intervalli sono grandi:

    EXTRACT(EPOCH FROM field)::int


Non credo che Redshift supporti il ​​tipo di dati INTERVAL. Sarebbe semplicemente GRANDE.
matt2000,

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

Ecco la semplice query che calcola il numero totale di giorni.


4
Questo non richiede un valore di intervallo.
Teddy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.