make_date 函数在 plpgsql 中不存在

make_date function does not exist in plpgsql

我有一个 plpgsql 函数。我需要从今天算起 5 天的日期,然后将月份分成“五个”以开始“最后五个”。问题是 make_date 在服务器上使用的 posgres 版本中不存在....

create or replace function getFirstDayOfFive()
returns timestamp with time zone as $$
declare
    firstDay timestamp;
    startOp timestamp;
begin
startOp = now() - interval '5 day';
SELECT
    make_date(
        date_part('year', startOp)::int,
        date_part('month', startOp)::int,
        greatest(
            floor(date_part('day', startOp) / 5) * 5,
            1
        )::int
    )
INTO firstDay;

RETURN firstDay;
    
end;

$$
language plpgsql;

上周还好好的,现在调用就报错了

ERROR: BŁĄD:  function make_date(integer, integer, integer) does not exist
LINE 2:     make_date(
            ^
HINT:  There is no function matching provided name and arguments. Maybe you should cast data.
QUERY:  SELECT
    make_date(
        date_part('year', startOp)::int,
        date_part('month', startOp)::int,
        greatest(
            floor(date_part('day', startOp) / 5) * 5,
            1
        )::int
    )
CONTEXT:  PL/pgSQL function "getfirstdayoffive" line 7 at wyrażenie SQL


SQL state: 42883

发生了什么事,之前它工作正常,现在却出错了?

[编辑] 我发现 make_date 可以从 postgresQL 9.4 获得,但是在服务器上有 posthresQL 9.1 有没有办法在这个旧版本的 od DB 中做同样的事情?我正在尝试用

之类的东西替换 make_date
create or replace function getFirstDayOfFive()
returns timestamp with time zone as $$
declare
    firstDay timestamp;
    startOp timestamp;
begin
startOp = now() - interval '5 day';
SELECT
    date to_char(startOp, 'YYYY-MM-')||to_char(greatest(
            floor(date_part('day', startOp) / 5) * 5,
            1
        )::int)
INTO firstDay;
RETURN firstDay;  
end;
$$
language plpgsql;

我认为您可以通过简单地将所需的天数添加到月初来简化此操作。显然你只想要一个 date 所以我也建议将 return 类型更改为 date

create or replace function getfirstdayoffive()
returns date
as
$$
   select date_trunc('month', current_date - 5)::date 
          + (greatest(floor(extract(day from current_date - 5) / 5) * 5, 1))::int - 1;
$$    
language sql
stable;