Да, вы можете.Это действительно легко, когда вы освоитесь.Я думаю, что это одна из жемчужин SQL и особенно легко в PostgreSQL из-за его превосходной временной поддержки.Часто сложные функции могут превращаться в очень простые запросы в SQL, которые можно масштабировать и правильно индексировать.
При этом используется generate_series для составления выборки временных отметок, которые разнесены на 1 минуту.Затем внешний запрос извлекает минуты и использует модуль по модулю, чтобы найти значения с интервалом в 5 минут.
select
ts,
extract(minute from ts)::integer as minute
from
( -- generate some time stamps - one minute apart
select
current_time + (n || ' minute')::interval as ts
from generate_series(1, 30) as n
) as timestamps
-- extract the minute check if its on a 5 minute interval
where extract(minute from ts)::integer % 5 = 0
-- only pick this hour
and extract(hour from ts) = extract(hour from current_time)
;
ts | minute
--------------------+--------
19:40:53.508836-07 | 40
19:45:53.508836-07 | 45
19:50:53.508836-07 | 50
19:55:53.508836-07 | 55
Обратите внимание, как можно добавить вычисляемый индекс в предложении where (где значение выражения будетвверх индекс) может привести к значительному улучшению скорости.Возможно, не очень избирательно в этом случае, но хорошо бы об этом знать.
Я однажды написал систему резервирования в PostgreSQL (в которой было много временной логики, где интервалы дат не могли перекрываться), и мне никогда не приходилось прибегать к итеративнымметоды.
http://www.amazon.com/SQL-Design-Patterns-Programming-Focus/dp/0977671542 - отличная книга, в которой есть много интервальных примеров.Трудно найти в книжных магазинах сейчас, но оно того стоит.