¿Cómo genero una serie temporal en PostgreSQL?

Respuestas:

14

Para optimizar:

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

La fecha es irrelevante, así que use constantes de marca de tiempo arbitrarias. El reparto a timees muy barato.
Esto incluye el límite inferior y superior, por lo que obtenemos '00:00' dos veces . Úselo '2000-01-01 23:59'como límite superior para obtenerlo solo una vez.

Relacionado:

Erwin Brandstetter
fuente
Encuentro que algo sobre la fecha arbitraria es muy feo. Pero estaba pensando que, de hecho, sería más rápido y mejor también.
Evan Carroll
Como la fecha es irrelevante, también puede ser arbitraria. Es la forma más rápida.
Erwin Brandstetter
6

No estoy seguro de si esta es la mejor manera, pero podemos usar generate_seriespara generar el desplazamiento mínimo desde 00:00:00y luego simplemente llamar make_interval(mins=>)para obtener el intervalo.

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

Me gustó @EvanCarroll, pero otra opción más:

select  x::time
from    generate_series 
            (current_date,current_date + '1 day - 1 second'::interval,'5 minute') as t(x);
David דודו Markovitz
fuente
Esto solo funcionará a veces en algunos lugares. Está sujeto a DST borking. Vea mi respuesta aquí para más información.
Evan Carroll
3

De otra manera:

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