例えば、今月を含んで過去3年の間の日付を月ごとに得る例。
(わかりやすくするために、generate_series()の引数を改行してあります。)
select * from generate_series( date_trunc('month',current_date)+'-3 years +1 month', date_trunc('month',current_date), '1 month' ) as months(mon)
generate_series()関数の引数に、日付データとINTERVAL型を与えればよくて、ひと月ずつ間隔を開けるのもINTERVAL型で解決可能っていう。