генерировать серии с 15-минутным интервалом, но пропускать каждую неделю

Мне нужно generate_series с 15-минутным интервалом. Предостережение в том, что мне нужно пропускать каждую неделю.

Это то, что у меня есть до сих пор, которое получает серию с 15-минутными интервалами, но чтобы не пропускать каждую неделю.

select i from generate_series('2017-01-01', '2017-12-31', '15 minutes'::interval) as g(i);

Я также могу generate_series каждую вторую неделю:

select i from generate_series('2017-12-31', '2017-01-01', '-2 week'::interval) as g(i)

просто нужна помощь в объединении обоих: чтобы получить 15-минутный интервал, но пропуская каждую вторую неделю

образец результата:

timestamp
----------------------
2017-01-01 00:00:00+00
2017-01-01 00:15:00+00
2017-01-01 00:30:00+00
...
2017-01-15 00:45:00+00
2017-01-15 01:00:00+00
2017-01-15 01:15:00+00
...
2017-01-29 00:30:00+00
2017-01-29 00:45:00+00
2017-01-29 01:00:00+00

Спасибо


person ezeagwulae    schedule 20.10.2017    source источник


Ответы (1)


Вам нужно два цикла — один для первого дня недели, а другой для 15-минутных интервалов внутри недели. В SQL перекрестное соединение используется для реализации вложенных циклов:

select tstamp
from generate_series('2017-01-01', '2017-12-31', '2 week'::interval) as start_of_week
cross join generate_series(start_of_week::date, start_of_week::date+ '1 week'::interval, '15 min'::interval) as tstamp
person klin    schedule 20.10.2017
comment
это полезно знать о методе перекрестного соединения. работает как шарм. Благодарность - person ezeagwulae; 21.10.2017
comment
как я могу настроить его так, чтобы он генерировал только часы с 18:00 до 6:00 и пропускал все часы, не относящиеся к этому временному интервалу? generate_series('2017-01-01 18:00'::timestamp, '2017-12-31 06:00'::timestamp, '15 minutes'::interval) as g(i) - person ezeagwulae; 02.11.2017
comment
Если вы хотите получить только половину дней с 18:00, используйте: where (tstamp- interval '18h')::time between '0:00' and '12:00' - person klin; 02.11.2017