18

generate_series 関数を使用して PostgreSQL でシリーズを生成しようとしています。2008 年 1 月からcurrent month + 12(1 年後) までの一連の月が必要です。私はPostgreSQL 8.3.14を使用しており、これに制限されています(したがって、8.4にはタイムスタンプシリーズのオプションがありません)。

次のような一連の日を取得する方法を知っています。

select generate_series(0,365) + date '2008-01-01'

しかし、私は月のやり方がわかりません。

4

5 に答える 5

22
select DATE '2008-01-01' + (interval '1' month * generate_series(0,11))

編集

数値を動的に計算する必要がある場合は、次のことが役立ちます。

select DATE '2008-01-01' + (interval '1' month * generate_series(0,month_count::int))
from (
   select extract(year from diff) * 12 + extract(month from diff) + 12 as month_count
   from (
     select age(current_timestamp, TIMESTAMP '2008-01-01 00:00:00') as diff 
   ) td
) t

これにより、2008-01-01からの月数が計算され、その上に12が追加されます。

しかし、私はスコットに同意します。これを集合戻り関数に入れて、次のようなことができるようにする必要があります。select * from calc_months(DATE '2008-01-01')

于 2011-09-16T21:33:20.067 に答える
9

次のように generate_series の間隔をあけることができます。

SELECT date '2014-02-01' + interval '1' month * s.a AS date
  FROM generate_series(0,3,1) AS s(a);

その結果、次のようになります。

        date         
---------------------
 2014-02-01 00:00:00
 2014-03-01 00:00:00
 2014-04-01 00:00:00
 2014-05-01 00:00:00
(4 rows)

この方法で他のテーブルに参加することもできます。

SELECT date '2014-02-01' + interval '1' month * s.a AS date, t.date, t.id
  FROM generate_series(0,3,1) AS s(a)
LEFT JOIN <other table> t ON t.date=date '2014-02-01' + interval '1' month * s.a;
于 2014-02-07T08:27:55.820 に答える
1

ええと、あなたが数ヶ月しか必要としないなら、あなたはすることができます:

select extract(month from days)
from(
  select generate_series(0,365) + date'2008-01-01' as days
)dates
group by 1
order by 1;

それを日付文字列に解析するだけです...

しかし、あなたはあなたが月1、2、..、12で終わることを知っているので、なぜただ一緒に行かないのselect generate_series(1,12);ですか?

于 2011-09-16T21:31:31.667 に答える