मैं वास्तव में एंडोमर के समाधान का समर्थन करता हूं (ऐसी प्रक्रियाओं के अतिरिक्त जो स्वचालित रूप से अवधि तालिका को भरती हैं), लेकिन मनोरंजन के लिए यहां एक समाधान है जिसकी आवश्यकता नहीं है।
CREATE TABLE your_table (start_date date, end_date date);
INSERT INTO your_table VALUES ('Jan-17-2008', 'May-20-2009');
SELECT
GREATEST(start_date, ('04-01-'||series.year)::date) AS year_start,
LEAST(end_date, ('03-31-'||series.year + 1)::date) AS year_end
FROM
(SELECT
start_date,
end_date,
generate_series(
date_part('year', your_table.start_date - INTERVAL '3 months')::int,
date_part('year', your_table.end_date - INTERVAL '3 months')::int)
FROM your_table) AS series(start_date, end_date, year)
ORDER BY
start_date;