web-dev-qa-db-fra.com

Comment générer une série temporelle dans PostgreSQL?

Si vous cherchez à générer une série de dates, consultez cette question

Disons que je veux générer une série toutes les 5 minutes pendant 24 heures. Comment faire cela dans PostgreSQL?

PostgreSQL peut generate_series() à partir d'un timestamp, mais pas à partir de time.

Est-il préférable de choisir un horodatage arbitraire ou existe-t-il une autre façon de générer la série?

9
Evan Carroll

Optimiser:

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

La date n'est pas pertinente, utilisez donc des constantes d'horodatage arbitraires. Le cast vers time est très bon marché.
Cela inclut les limites inférieure et supérieure, nous obtenons donc '00:00' deux fois . Utilisation '2000-01-01 23:59' comme limite supérieure pour l'obtenir une seule fois.

En relation:

14
Erwin Brandstetter

Je ne sais pas si c'est la meilleure façon, mais nous pouvons utiliser generate_series Pour générer le min-offset à partir de 00:00:00, Puis appeler simplement make_interval(mins=>) pour en obtenir l'intervalle.

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

J'ai aimé la manière @EvanCarroll, mais encore une autre option -

select  x::time
from    generate_series 
            (current_date,current_date + '1 day - 1 second'::interval,'5 minute') as t(x);
5

Autrement:

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