2013-01-19 68 views
6

我試圖自動執行一個日期範圍的PLPGSQL函數的過程。
通常我需要運行下面的代碼,每個函數調用每天產生一個表:在SQL中編寫函數以遍歷UDF中的日期範圍

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); 

是否有這樣的事情用一個簡單的循環或函數的任意日期範圍自動化的好方法?

我在想這可能很難處理月月的情況,所以我認爲最好假定日期範圍爲一個月。

+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

我發現這是有幫助的,但是當我運行它時,我發現不是返回所有將返回的列,如果我只爲一個日期運行我的函數,它將返回一個包含所有原始列的單列一起。有沒有辦法來解決這個問題? –

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當你想不關心的返回值。
  • 您只需將integer添加到date即可增加。月份或年份邊界與此無關。