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

Posted

技术标签:

【中文标题】在 SQL 中编写函数以遍历 UDF 中的日期范围【英文标题】:Writing a function in SQL to loop through a date range in a UDF 【发布时间】:2013-01-19 10:06:42 【问题描述】:

我正在尝试自动化运行 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);

有没有一种好方法可以通过简单的循环或函数在任意日期范围内自动执行此类操作?

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

【问题讨论】:

你试过generate_series函数吗? 【参考方案1】:

不需要函数:

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

这适用于任何日期范围。不仅仅是一个月内。

【讨论】:

我发现这很有帮助,但是当我运行它时,我发现如果我只运行一个日期,而不是返回所有将返回的列,而是返回一个将所有原始列连接在一起的列。有没有办法解决这个问题?【参考方案2】:

简单的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 即可递增。这样,月或年的界限就无关紧要了。

【讨论】:

以上是关于在 SQL 中编写函数以遍历 UDF 中的日期范围的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL 循环遍历日期范围

日期递增的 Hive UDF

SQL Server 2008 中的 While 循环遍历日期范围,然后插入

PySpark 分组并逐行应用 UDF 操作

函数在代码中工作,但不能作为工作表中的 UDF

BigQuery JavaScript UDF 使用 SQL 查询中的值调用数组