Как создать временной ряд в PostgreSQL?

9

Если вы хотите создать серию дат, посмотрите этот вопрос

Допустим, я хочу генерировать серию каждые 5 минут в течение 24 часов. Как мне это сделать в PostgreSQL?

PostgreSQL может generate_series()из timestamp, но не из time.

Лучше выбрать произвольную временную метку или есть другой способ генерации серии?

Эван Кэрролл
источник

Ответы:

14

Для оптимизации:

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

Дата не имеет значения, поэтому используйте произвольные константы меток времени. Актерский состав timeочень дешевый.
Это включает в себя нижнюю и верхнюю границу, поэтому мы получаем в '00:00' два раза . Используйте в '2000-01-01 23:59'качестве верхней границы, чтобы получить его только один раз.

Связанные с:

Эрвин Брандштеттер
источник
Я нахожу что-то о произвольной дате очень уродливым. Но я думал, что на самом деле это будет быстрее и лучше.
Эван Кэрролл
Поскольку дата не имеет значения, она также может быть произвольной. Это самый быстрый способ.
Эрвин Брандштеттер
7

Не уверен, что это лучший способ, но мы можем использовать его generate_seriesдля генерации минимального смещения, 00:00:00а затем просто вызвать его, make_interval(mins=>)чтобы получить интервал.

SELECT make_interval(mins=>x)::time
FROM generate_series(0, 60*24-5, 5) AS t(x);
Эван Кэрролл
источник
5

Мне понравился способ @EvanCarroll, но еще один вариант -

select  x::time
from    generate_series 
            (current_date,current_date + '1 day - 1 second'::interval,'5 minute') as t(x);
Дэвид Markודו Марковиц
источник
Это будет работать только иногда в некоторых местах. Это зависит от DST Borking. Смотрите мой ответ здесь для получения дополнительной информации.
Эван Кэрролл
3

Другой путь:

SELECT '00:00:00'::time + x * '1 minute'::interval
FROM generate_series(0, 60*24, 5) AS t(x);
ypercubeᵀᴹ
источник