函数的WHERE子句中的日期部分

时间:2017-04-27 10:38:19

标签: postgresql function datetime plpgsql dynamic-sql

我想从表格中选择日期在给定月份内的人 这是我到目前为止所做的,但它不起作用:

CREATE OR REPLACE FUNCTION u7()
RETURNS character varying AS
$BODY$
    DECLARE
        data varchar=`data`;
        mes varchar=`2016-11-21`;
        incidencia varchar=`expulsions`;
        valor varchar;
    BEGIN
        EXECUTE `SELECT `
        ||quote_ident(data)
        ||`FROM `
        ||quote_ident(incidencia)
        ||` WHERE data IN(select date_part(`month`, TIMESTAMP $1))`
        INTO valor USING mes;
        return valor;
    END;
$BODY$
LANGUAGE plpgsql;

select * FROM u7();

1 个答案:

答案 0 :(得分:0)

您尝试执行的操作的清晰语法可能如下所示:

CREATE OR REPLACE FUNCTION u7()
  RETURNS TABLE (valor text) AS
$func$
DECLARE
   data       text := 'data';    -- the first 3 would typically be function parameters
   incidencia text := 'expulsions';
   mes        timestamp = '2016-11-21';

   mes0       timestamp := date_trunc('month', mes);
   mes1       timestamp := (mes0 + interval '1 month');
BEGIN
   RETURN QUERY EXECUTE format(
     'SELECT %I
      FROM   %I
      WHERE  datetime_column_name >= $1
      AND    datetime_column_name <  $2'
    , data, incidencia)
   USING mes0, mes1;
END
$func$  LANGUAGE plpgsql;

SELECT * FROM u7();

显然,data不能同时是文本列和时间戳或日期列。我使用datetime_column_name作为时间戳列 - 假设它的数据类型为timestamp

除了各种语法错误之外,不要将构造与date_part()一起使用。这样你就不得不处理表格的每一行而不能使用datetime_column_name上的索引 - 这是我建议的替代方案。

有关说明,请参阅相关答案:

相关问题