WITH --startign month startm AS ( SELECT 1 as m ) ,m AS ( SELECT g.s calendar_month ,startm.m starting_month ,g.s + CASE WHEN g.s < startm.m THEN startm.m +1 ELSE -startm.m +1 END fisc_month FROM generate_series(1,12,1) g(s) CROSS JOIN startm ) --select * from m INSERT INTO evt.fspr SELECT --TO_CHAR(gs.d,'YYYY.MM.DD')::ltree t1 ( --year to_char(extract(year from gs.d),'FM0000') --month ||'.'||to_char(m.fisc_month,'FM00') )::ltree t2 ,tstzrange(gs.d,gs.d + '1 month'::interval) r FROM generate_series('2018-01-01 00:00'::timestamptz,'2099-12-01 00:00'::timestamptz,'1 month') gs(d) INNER JOIN m ON m.calendar_month = extract(month from gs.d) ORDER BY gs.d ASC