Як створити часовий ряд у 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);

Це спрацює лише іноді в деяких місцях. Це підлягає ДСТ заборгованості. Дивіться мою відповідь тут для отримання додаткової інформації.
Еван Керролл

3

Інший спосіб:

SELECT '00:00:00'::time + x * '1 minute'::interval
FROM generate_series(0, 60*24, 5) AS t(x);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.