Jak wygenerować szereg czasowy w PostgreSQL?

Odpowiedzi:

14

Aby zoptymalizować:

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

Data nie ma znaczenia, więc używaj dowolnych stałych znaczników czasu. Obsada timejest bardzo tania.
Obejmuje to dolną i górną granicę, więc otrzymujemy '00:00' dwa razy . Użyj '2000-01-01 23:59'jako górnej granicy, aby uzyskać go tylko raz.

Związane z:

Erwin Brandstetter
źródło
Uważam, że dowolna data jest bardzo brzydka. Ale myślałem, że tak naprawdę będzie to szybsze i lepsze.
Evan Carroll
Ponieważ data jest nieistotna, równie dobrze może być dowolna. To najszybszy sposób.
Erwin Brandstetter,
7

Nie jestem pewien, czy jest to najlepszy sposób, ale możemy użyć generate_seriesdo wygenerowania minimalnego przesunięcia, 00:00:00a następnie po prostu wywołać, make_interval(mins=>)aby uzyskać od niego odstęp.

SELECT make_interval(mins=>x)::time
FROM generate_series(0, 60*24-5, 5) AS t(x);
Evan Carroll
źródło
5

Podobał mi się sposób @EvanCarroll, ale jeszcze jedna opcja -

select  x::time
from    generate_series 
            (current_date,current_date + '1 day - 1 second'::interval,'5 minute') as t(x);
David Markודו Markovitz
źródło
Będzie to czasem działać tylko w niektórych miejscach. Podlega borkingowi DST. Zobacz moją odpowiedź tutaj, aby uzyskać więcej informacji.
Evan Carroll
3

Inny sposób:

SELECT '00:00:00'::time + x * '1 minute'::interval
FROM generate_series(0, 60*24, 5) AS t(x);
ypercubeᵀᴹ
źródło