在SQL中编写函数以遍历UDF中的日期范围

时间:2013-01-19 10:06:43

标签: sql postgresql plpgsql

我正在尝试自动运行一系列日期的PLPGSQL函数 通常,我必须运行以下代码,每个函数调用每天生成一个表:

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

使用简单的循环或函数为任意日期范围自动化这种事情是否有好方法?

我认为可能很难处理每个月的情况,所以我认为最好假设日期范围是一个月。

2 个答案:

答案 0 :(得分:16)

不需要功能:

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即可。月份或年份的界限与此无关。
相关问题