2013-06-28 5 views
2

Мне нужно сгенерировать серию кварталов с заданной датой начала и датой окончания. Я знаю generate_series(), но он просто не работает с quarter:Создайте серию кварталов в Postgresql

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

Что делает четверть такой особенной? В противном случае generate_series() работает с почти все, от микросекунд до тысячелетию:

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'); 

Если quarter не может быть использован, то, что это лучший другой вариант? На данный момент, у меня есть:

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; 

ответ

7

не должны это делать то, что вы ожидаете:

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

Результат:

 
    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) 
+0

ОК, я был слеп :) Это работает, но он должен быть «3 месяца» для кварталов. –

+0

Ах, конечно :) Отвечено на 3 месяца –