sql - 在 postgresql 中创建 N 天间隔函数
问题描述
我正在尝试在 postgresql 中创建一个函数,该函数以一定的间隔返回两个日期之间的一组日期。例如,如果我传递这两个日期参数,比如most_recent_day = 2020-01-10
andmininum_day = 2020-01-01
和这个间隔参数n_day_group_interval = 5
,函数将返回以下集合:
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;
推荐阅读
- javascript - 使用 Jquery 在特定按钮单击时切换特定 div
- verilog - 合成期间创建的额外 regs
- php - symfony中的Ajax调用过滤表
- mysql - MySQL:将子选择和数组组合成一个 IN 语句
- android - 如何将二维码详细信息保存到 ListView
- c# - 发布到事件网格失败并显示“任务已取消”
- javascript - 使用 jQuery 和 CSS3 自定义圆形光标
- java - 在 Lambda 函数 (Java) 中加载类时出错
- ios - 在情节提要中加载 xib 视图。为什么我们必须做 self.addSubview(nibView) ?
- low-latency - 用于估计启用 NUMA 的改进的 Memory Profiler 工具