Generate series of quarters in Postgresql

postgresql, postgresql-9.1

Solution

Shouldn't this do what you expect:

SELECT * FROM generate_series('2008-01-01 00:00'::timestamp,
                              '2009-01-01 12:00', '3 months');

Result:

   generate_series   
---------------------
 2008-01-01 00:00:00
 2008-04-01 00:00:00
 2008-07-01 00:00:00
 2008-10-01 00:00:00
 2009-01-01 00:00:00
(5 rows)

Problem

I need to generate series of quarters, given start date and end date. I know of `generate_series()`, but it just does not work with `quarter`: ``` SELECT * FROM generate_series('2008-01-01 00:00'::timestamp,'2009-01-01 12:00', '1 quarter'); ``` What makes quarter so special? Otherwise `generate_series()` works with pretty much everything, from microseconds to millenium: ``` select * from generate_series('2008-01-01 00:00'::timestamp,'2008-01-01 00:00:00.001', '1 microsecond'); select * from generate_series('2008-01-01 00:00'::timestamp,'2008-01-01 00:01', '1 second'); select * from generate_series('2008-01-01 00:00'::timestamp,'2008-01-01 01:00', '1 minute'); select * from generate_series('2008-01-01 00:00'::timestamp,'2008-01-01 12:00', '1 hour'); select * from generate_series('2008-01-01 00:00'::timestamp,'2009-01-01 12:00', '1 day'); select * from generate_series('2008-01-01 00:00'::timestamp,'2009-01-01 12:00', '1 week'); select * from generate_series('2008-01-01 00:00'::timestamp,'2009-01-01 12:00', '1 month'); select * from generate_series('2008-01-01 00:00'::timestamp,'2009-01-01 12:00', '1 year'); select * from generate_series('2008-01-01 00:00'::timestamp,'2009-01-01 12:00', '1 decade'); select * from generate_series('2008-01-01 00:00'::timestamp,'2009-01-01 12:00', '1 century'); select * from generate_series('2008-01-01 00:00'::timestamp,'2009-01-01 12:00', '1 millennium'); ``` If `quarter` cannot be used then what is the best other option? For now, I have: ``` select date_trunc('quarter',generate_series) gs from generate_series('2008-01-01 00:00'::timestamp,'2009-01-01 12:00', '1 month') group by gs order by gs; ```

Original source