Bagaimana saya mengubah interval menjadi beberapa jam dengan postgres?

161

Katakanlah saya punya interval suka

4 days 10:00:00

dalam postgres. Bagaimana saya mengonversinya menjadi beberapa jam (106 dalam kasus ini?) Apakah ada fungsi atau haruskah saya menggigit peluru dan melakukan sesuatu seperti

extract(days, my_interval) * 24 + extract(hours, my_interval)
agnul
sumber
9
Catatan: Jika interval Anda mengandung bulan atau tahun, tidak ada jawaban pasti tentang berapa jam yang ada, karena jumlah hari dalam satu bulan atau tahun bervariasi. Jadi hati-hati!
Teddy

Jawaban:

314

Mungkin cara termudah adalah:

SELECT EXTRACT(epoch FROM my_interval)/3600
Magnus Hagander
sumber
6
Dan mungkin lantai atau melemparkan hasilnya ke bilangan bulat jika intervalnya berisi menit dan / atau detik
rasjani
64
Ekstrak zaman? Ya ampun, itu tidak akan terlintas dalam pikiran saya dalam sejuta tahun.
agnul
5
SELECT EXTRACT (epoch FROM my_interval / 3600) (interval memiliki dukungan 'divide integer' asli, hasilnya adalah interval, dan hasil ekstrak bilangan bulat, bukan mengambang). Begitu. Autocast / Lantai selesai.
Offenso
19
Peringatan: mengekstraksi zaman secara implisit mengasumsikan bahwa satu bulan = 30 hari dan satu tahun = 365,25 hari.
Teddy
@ Teddy apa yang bisa kita lakukan dengannya? Bagaimana cara menghindari masalah ini dan mendapatkan jumlah zaman yang sebenarnya?
Asmox
18

Jika Anda ingin bilangan bulat yaitu jumlah hari:

SELECT (EXTRACT(epoch FROM (SELECT (NOW() - '2014-08-02 08:10:56')))/86400)::int
Pujan Srivastava
sumber
Bagus! Terima kasih untuk itu :) Namun, saya menemukan bahwa kita sekarang dapat memodifikasi ini menjadi SELECT extract('epoch' FROM age('2014-08-02'::timestamp)) / 86400(saya menggunakan Pg 9.4), karena age(ts)secara otomatis digunakan CURRENT_DATEketika hanya satu argumen.
1111161171159459134
7
Peringatan: mengekstraksi zaman secara implisit mengasumsikan bahwa satu bulan = 30 hari dan satu tahun = 365,25 hari.
Teddy
3

Untuk mendapatkan jumlah hari, cara termudah adalah:

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

Sejauh yang saya tahu itu akan kembali sama dengan:

SELECT (EXTRACT(epoch FROM (SELECT (NOW() - '2014-08-02 08:10:56')))/86400)::int;
Belveryin
sumber
28
Jika interval Anda '1 month 0 days', menggunakan extract(day from …)akan memberi Anda 0hasilnya.
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));

The ::intkonversi mengikuti prinsip pembulatan. Jika Anda menginginkan hasil yang berbeda seperti pembulatan ke bawah, Anda dapat menggunakan fungsi matematika yang sesuai seperti floor.

haoming
sumber
1

Jika Anda mengonversi bidang tabel:

  1. Tentukan bidangnya sehingga berisi detik:

     CREATE TABLE IF NOT EXISTS test (
         ...
         field        INTERVAL SECOND(0)
     );
  2. Ekstrak nilainya. Ingatlah untuk melemparkan ke orang bijak lain Anda bisa mendapatkan kejutan yang tidak menyenangkan begitu intervalnya besar:

    EXTRACT(EPOCH FROM field)::int

Janek Olszak
sumber
Saya tidak berpikir Redshift mendukung datatype INTERVAL. Itu hanya akan menjadi BIGINT.
matt2000
-4
         select date 'now()' - date '1955-12-15';

Berikut ini adalah kueri sederhana yang menghitung jumlah total hari.

Arunkumar Papena
sumber
4
Itu tidak mengambil nilai interval.
Teddy