¿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:


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

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

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);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.