2013-01-19 15 views
6

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

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ヶ月であると仮定してください。

+0

'generate_series'関数を試しましたか? –

答えて

14

機能は必要ない:

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

これは、任意の日付範囲のために動作します。内部の月の1つだけではありません。

+1

これは参考になりましたが、私が実行したときに、1つの日付だけ関数を実行すると返されるすべての列を返すのではなく、元の列をすべて連結した単一の列を返します一緒に。これを修正する方法はありますか? –

4

シンプル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あなたは、戻り値を気にしないでくださいしたいです。
  • integerdateに追加するだけで増分できます。月または年の境界はこのようには関係ありません。
関連する問題