9

PLPGSQLある範囲の日付で関数を実行するプロセスを自動化しようとしています。
通常、関数呼び出しごとに1日あたり1つのテーブルを生成する次のコードを実行する必要があります。

SELECT dhcp.singleday('2012-11-24'::date, '2012-11-25'::date);
SELECT dhcp.singleday('2012-11-25'::date, '2012-11-26'::date);
SELECT dhcp.singleday('2012-11-26'::date, '2012-11-27'::date);
SELECT dhcp.singleday('2012-11-27'::date, '2012-11-28'::date);
SELECT dhcp.singleday('2012-11-28'::date, '2012-11-29'::date);
SELECT dhcp.singleday('2012-11-29'::date, '2012-11-30'::date);
SELECT dhcp.singleday('2012-11-30'::date, '2012-12-01'::date);
SELECT dhcp.singleday('2012-12-01'::date, '2012-12-02'::date);
SELECT dhcp.singleday('2012-12-02'::date, '2012-12-03'::date);
SELECT dhcp.singleday('2012-12-03'::date, '2012-12-04'::date);

任意の日付範囲の単純なループまたは関数を使用して、この種のことを自動化する良い方法はありますか?

月ごとに行く場合は扱いにくいのではないかと思いますので、日付範囲は1ヶ月の方がいいと思います。

4

2 に答える 2

23

機能の必要はありません:

select dhcp.singleday(a::date, a::date + 1)
from generate_series(
    '2012-11-24'::date,
    '2012-12-03',
    '1 day'
) s(a)

これは、任意の日付範囲で機能します。1か月以内だけではありません。

于 2013-01-19T13:05:38.537 に答える
8

単純なplpgsql関数:

CREATE OR REPLACE FUNCTION f_machine_gun_sally(date, date)
  RETURNS void AS
$func$
DECLARE
    d date := $1;
BEGIN

LOOP
    PERFORM dhcp.singleday(d, d+1);
    d := d + 1;
    EXIT WHEN d > $2;
END LOOP;

END
$func$ LANGUAGE plpgsql;
  • PERFORM戻り値を気にしない場合に使用します。
  • integeraにを追加するだけdateでインクリメントできます。このように、月または年の境界は関係ありません。
于 2013-01-19T10:36:21.237 に答える