在 postgresql 中创建 N 天间隔函数
Creating N days interval function in postgresql
我正在尝试在 postgresql 中创建一个函数,该函数 return 是两个日期之间具有特定间隔的一组日期。例如,如果我传递这两个日期参数 most_recent_day = 2020-01-10
和 mininum_day = 2020-01-01
以及这个间隔参数 n_day_group_interval = 5
,该函数将 return 以下集合:
2020-01-10
2020-01-08
2020-01-06
2020-01-04
2020-01-02
以下是我给出 syntax error at or near "end"
的尝试。谢谢你的帮助。
create function get_n_day_group_dates(most_recent_day date, minimum_day date, n_day_group_interval varchar)
returns table (
n_day_group_dates date
)
as $body$
begin
return query
SELECT
date_trunc('day'::text, dd.dd)::date AS n_day_group_dates
FROM
LATERAL generate_series(most_recent_day,
minimum_day,
'-'||n_day_group_interval||' day'::interval) dd(dd)
end;
$body$
language plpgsql;
你把事情复杂化了。 LATERAL 不是必需的,date_trunc('day', ..)
与转换为 date
.
相同
要根据变量创建区间,最简单的方法是使用make_interval()
create function get_n_day_group_dates(most_recent_day date, minimum_day date, n_day_group_interval varchar)
returns table (n_day_group_dates date)
as $body$
SELECT g.dt::date
FROM generate_series(most_recent_day,
minimum_day,
make_interval(days => n_day_group_interval) as g(dt);
$body$
language sql;
我正在尝试在 postgresql 中创建一个函数,该函数 return 是两个日期之间具有特定间隔的一组日期。例如,如果我传递这两个日期参数 most_recent_day = 2020-01-10
和 mininum_day = 2020-01-01
以及这个间隔参数 n_day_group_interval = 5
,该函数将 return 以下集合:
2020-01-10
2020-01-08
2020-01-06
2020-01-04
2020-01-02
以下是我给出 syntax error at or near "end"
的尝试。谢谢你的帮助。
create function get_n_day_group_dates(most_recent_day date, minimum_day date, n_day_group_interval varchar)
returns table (
n_day_group_dates date
)
as $body$
begin
return query
SELECT
date_trunc('day'::text, dd.dd)::date AS n_day_group_dates
FROM
LATERAL generate_series(most_recent_day,
minimum_day,
'-'||n_day_group_interval||' day'::interval) dd(dd)
end;
$body$
language plpgsql;
你把事情复杂化了。 LATERAL 不是必需的,date_trunc('day', ..)
与转换为 date
.
要根据变量创建区间,最简单的方法是使用make_interval()
create function get_n_day_group_dates(most_recent_day date, minimum_day date, n_day_group_interval varchar)
returns table (n_day_group_dates date)
as $body$
SELECT g.dt::date
FROM generate_series(most_recent_day,
minimum_day,
make_interval(days => n_day_group_interval) as g(dt);
$body$
language sql;