Project a time range in multiple rows with Postgres
You can use generate_series() for this. 

select t.avg_income, d.month
from the_table t
  cross join lateral ( 
    select g.m::date as month
    from generate_series(date_trunc('month', t.date_from), date_trunc('month', t.date_to), interval '1 month') as g (m)
  ) as d
order by t.avg_income, d.month;


Alternatively:

select t.avg_income, d.month::date
from the_table t
  cross join lateral generate_series(date_trunc('month', t.date_from), date_trunc('month', t.date_to), interval '1 month') as d (month)
order by t.avg_income, d.month;


Online example: http://rextester.com/ADG4243