日期隐式转换为整数

时间:2019-03-01 08:55:06

标签: postgresql date time plpgsql

我正在学习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 :(得分:3)

您不需要动态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; 

Demo

答案 1 :(得分:1)

产生错误消息的原因是您执行的查询是(今天):

 var options = {
        width: 854,
        height: 480,
        layout: "video",
        autoplay: false
        };
        var embed = new Twitch.Player("stream", options);     
        changeChannel = (chan) => {
        embed.setChannel(chan);
        }

现在2019减去3减去2是2014,是整数。