Bagaimana cara menghasilkan deret waktu di PostgreSQL?

Jawaban:

14

Untuk mengoptimalkan:

SELECT x::time
FROM   generate_series(timestamp '2000-01-01 00:00'
                     , timestamp '2000-01-02 00:00'
                     , interval  '5 min') t(x);

Tanggal tidak relevan, jadi gunakan konstanta timestamp sewenang-wenang. Para pemainnya timesangat murah.
Ini termasuk batas bawah dan atas, jadi kami mendapat '00:00' dua kali . Gunakan '2000-01-01 23:59'sebagai batas atas untuk mendapatkannya sekali saja.

Terkait:

Erwin Brandstetter
sumber
Saya menemukan sesuatu tentang tanggal sewenang-wenang yang sangat jelek. Tapi, saya pikir itu sebenarnya akan lebih cepat dan lebih baik juga.
Evan Carroll
Karena tanggal itu tidak relevan, mungkin juga sewenang-wenang. Ini cara tercepat.
Erwin Brandstetter
6

Tidak yakin apakah ini cara terbaik, tapi kita bisa gunakan generate_seriesuntuk menghasilkan min-offset dari 00:00:00dan kemudian cukup menelepon make_interval(mins=>)untuk mendapatkan interval dari itu.

SELECT make_interval(mins=>x)::time
FROM generate_series(0, 60*24-5, 5) AS t(x);
Evan Carroll
sumber
5

Saya suka cara @EvanCarroll, tapi pilihan lain -

select  x::time
from    generate_series 
            (current_date,current_date + '1 day - 1 second'::interval,'5 minute') as t(x);
David Markודו Markovitz
sumber
Ini hanya akan bekerja kadang-kadang di suatu tempat. Ini tunduk pada DST borking. Lihat jawaban saya di sini untuk informasi lebih lanjut.
Evan Carroll
3

Cara lain:

SELECT '00:00:00'::time + x * '1 minute'::interval
FROM generate_series(0, 60*24, 5) AS t(x);
ypercubeᵀᴹ
sumber