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;
我有一个 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_datecreate 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;