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

Joh*_*ohn 5 sql postgresql

我有一个A包含startdate列的表,TIMESTAMP WITHOUT TIME ZONE我需要编写一个查询/函数来生成从MIN列的值到MAX列的值的月份列表。

例如:

startdate
2014-12-08
2015-06-16
2015-02-17
Run Code Online (Sandbox Code Playgroud)

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

我怎么做?我从未使用 PostgreSQL 生成不存在的数据...它总是在数据库中查找正确的数据...有什么想法如何做到这一点吗?在查询中可行吗?

Dav*_*ong 5

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

select * from generate_series('2017-01-01', now(), '1 month')
Run Code Online (Sandbox Code Playgroud)


Pat*_*ick 4

您可以使用以下函数生成数据序列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;
Run Code Online (Sandbox Code Playgroud)

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

SELECT string_agg("Mon-YY", ', ') AS "Mon-YY list"
FROM (
  -- Query above
) subsub;
Run Code Online (Sandbox Code Playgroud)

SQLFiddle 在这里