我有一个A带有startdate列的表,TIMESTAMP WITHOUT TIME ZONE我需要编写一个查询/函数来生成从MIN列的值到列的值的月份列表MAX。
A
startdate
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)
(Dec-14,Jan-15,Feb-15,Mar-15,Apr-15,May-15,Jun-15)
我怎么做?我从未使用PostgreSQL生成不存在的数据…它一直在数据库中找到正确的数据…有什么想法可以做到这一点吗?它在查询中可行吗?
您可以使用以下generate_series()函数生成数据序列:
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在这里