Como eu gero uma série temporal no PostgreSQL?

Respostas:

14

Otimizar:

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

A data é irrelevante, portanto, use constantes arbitrárias de carimbo de data / hora. O elenco timeé muito barato.
Isso inclui os limites inferior e superior, então obtemos '00:00' duas vezes . Use '2000-01-01 23:59'como limite superior para obtê-lo apenas uma vez.

Relacionado:

Erwin Brandstetter
fonte
Acho algo feio na data arbitrária muito feio. Mas, eu estava pensando que seria de fato mais rápido e melhor também.
Evan Carroll
Como a data é irrelevante, também pode ser arbitrária. É o caminho mais rápido.
Erwin Brandstetter
6

Não tenho certeza se essa é a melhor maneira, mas podemos usar generate_seriespara gerar o deslocamento mínimo 00:00:00e simplesmente chamar make_interval(mins=>)para obter o intervalo.

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

Gostei da maneira @EvanCarroll, mas mais uma opção -

select  x::time
from    generate_series 
            (current_date,current_date + '1 day - 1 second'::interval,'5 minute') as t(x);
David Markovitz
fonte
Às vezes, isso só funciona em alguns lugares. Está sujeito a DST borking. Veja minha resposta aqui para mais informações.
Evan Carroll
3

Outra maneira:

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