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

Réponses:

14

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 casting timeest très bon marché.
Cela inclut les limites inférieure et supérieure, nous obtenons donc '00:00' deux fois . Utilisez '2000-01-01 23:59'comme limite supérieure pour l'obtenir une seule fois.

En relation:

Erwin Brandstetter
la source
Je trouve que la date arbitraire est très moche. Mais je pensais que ce serait en fait plus rapide et meilleur aussi.
Evan Carroll
Étant donné que la date n'est pas pertinente, elle peut tout aussi bien être arbitraire. C'est le moyen le plus rapide.
Erwin Brandstetter
6

Je ne sais pas si c'est la meilleure façon, mais nous pouvons utiliser generate_seriespour générer le min-offset à partir de 00:00:00, puis simplement appeler 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);
Evan Carroll
la source
5

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);
David דודו Markovitz
la source
Cela ne fonctionnera que parfois dans certains endroits. Il est soumis au borking DST. Voir ma réponse ici pour plus d'informations.
Evan Carroll
3

Autrement:

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