дата неявно преобразуется в целое число - PullRequest
0 голосов
/ 01 марта 2019

Я изучаю PL / pgSQL.Я хочу напечатать даты следующих 15 дней в одном столбце.Поэтому я создал следующую функцию:

CREATE or replace FUNCTION p15d() 
  RETURNS table(date_ date ) AS $$ 
  declare 
  i date := current_date; 
  ii date := current_date + integer '15'; 
 BEGIN 
  loop 
      return query execute'select ' || (i + interval '1 day')::date; 
      i = i + 1; 
      exit when i = ii; 
  end loop; 
 END; 
 $$ 
 LANGUAGE plpgsql; 

Но когда я запускаю эту функцию, я получаю эту ошибку:

ERROR:  structure of query does not match function result type
DETAIL:  Returned type integer does not match expected type date in column 1.
CONTEXT:  PL/pgSQL function p15d() line 8 at RETURN QUERY

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Причина вашего сообщения об ошибке в том, что выполняемый вами запрос (сегодня):

select 2019-03-02

Теперь 2019 минус 3 минус 2 - это 2014, что является целым числом.

0 голосов
/ 01 марта 2019

Вам не требуется динамический SQL для добавления интервала в выражение.

CREATE or replace FUNCTION p15d() 
  RETURNS table(date_ date ) AS $$ 
  declare 
  i date := current_date; 
  ii date := current_date + integer '15'; 
 BEGIN 
  loop 
      return query  select ( i + interval '1 day' )::date; 
      i = i + 1; 
      exit when i = ii; 
  end loop; 
 END; 
 $$ 
 LANGUAGE plpgsql; 

Но такая функция не нужна, у Postgres уже есть функция generate_series, которая дает то, что вы хотите.

CREATE or replace FUNCTION p15d() 
  RETURNS table(date_ date ) AS 
 $$ 
   select generate_series(current_date+1,current_date + 15,interval '1 day' )::date; 
 $$ 
 LANGUAGE SQL; 

Демо

...