Вы можете использовать generate_series()
для этого.К сожалению, он не поддерживает генерацию серии значений time
напрямую.Поэтому вам нужно сгенерировать серию «количество минут», которое вы хотите добавить.Для этого вам нужно рассчитать количество минут между временем начала и окончания и использовать его для generate_series()
select time '10:00' + interval '1' minute * gs.minutes
from generate_series(0,
(extract(epoch from time '18:00' - time '10:00') / 60)::int,
10) as gs(minutes);
Выражение extract(epoch from time '18:00' - time '10:00') / 60
вычисляет количество минут между началом ивремя окончания и передает его в качестве верхнего предела значений для генерации (его необходимо привести к целому числу, чтобы сделать generate_series () счастливым).Третий параметр 10
указывает на генерацию числа с шагом 10. Затем он умножается с интервалом в 1 минуту и добавляется к начальному значению.
Обратите внимание, что литералы времени, написанные таким образом, используют стандартную 24-часовую запись ISO, а не AM / PM.Но вы можете отформатировать вывод, используя to_char()
, чтобы получить его, если хотите.Но вам лучше отформатировать это в вашем приложении, а не в SQL.
Онлайн-пример: https://rextester.com/XUJ25540
Альтернативный способ - использовать версию generate_series()
, которая генерирует временные метки, и приводить результат к значению time
(исключая датучасть):
select gs.ts::time
from generate_series(current_date + time '10:00',
current_date + time '18:00',
interval '10' minute) as gs(ts);
Онлайн пример: https://rextester.com/YRNAW81361