如何在PostgreSQL中生成月份列表?

时间:2015-07-16 08:07:22

标签: sql postgresql

我有一个Astartdate的表TIMESTAMP WITHOUT TIME ZONE我需要编写一个查询/函数,根据MIN值生成一个月份列表列的列MAX列。

例如:

startdate
2014-12-08
2015-06-16
2015-02-17

将生成以下列表:(Dec-14,Jan-15,Feb-15,Mar-15,Apr-15,May-15,Jun-15)

我该怎么做?我从来没有使用PostgreSQL来生成那些不存在的数据......它总是在数据库中找到正确的数据......任何想法如何做到这一点?它在查询中是否可行?

2 个答案:

答案 0 :(得分:2)

您可以使用generate_series()函数生成数据序列:

SELECT to_char(generate_series(min, max, '1 month'), 'Mon-YY') AS "Mon-YY"
FROM (
  SELECT date_trunc('month', min(startdate)) AS min, 
         date_trunc('month', max(startdate)) AS max
  FROM a) sub;

这会以漂亮的格式为每个月生成一行。如果你想让它像列表一样,你可以在外部查询中聚合它们:

SELECT string_agg("Mon-YY", ', ') AS "Mon-YY list"
FROM (
  -- Query above
) subsub;

SQLFiddle here

答案 1 :(得分:0)

对于寻找无格式月份列表的人:

select * from generate_series('2017-01-01', now(), '1 month')