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:


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);

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);

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);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.