【问题标题】:Date part in WHERE clause of a function函数 WHERE 子句中的日期部分
【发布时间】:2017-09-25 02:34:16
【问题描述】:

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

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();

【问题讨论】:

  • 为什么不select persons from expulsions where data = date_part'month','2016-11-21'); ?..为什么起作用?为什么它有常数?为什么连列名称都在常量之间?..你的目标是什么?..
  • 那些可怕的反引号在 Postgres 中是无效的。字符串常量必须放在单引号中:'data'postgresql.org/docs/current/static/…
  • 也推荐使用date_trunc()::date(获取月份的第一天),除非你不关心年份。要么那个,要么像to_char(mydatecolumn,'YYYYmm')
  • @a_horse_with_no_name 参数应该没问题。 "USING mes" 将 "mes" 传递给 "$1"
  • edit澄清问题。删除无意义的反引号,提供表定义(CREATE TABLE 语句)和您的 Postgres 版本。

标签: postgresql function datetime plpgsql dynamic-sql


【解决方案1】:

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

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 上使用索引 - 我建议的替代方法可以。

解释见相关答案:

【讨论】:

    猜你喜欢
    • 2012-01-02
    • 2013-11-24
    • 2021-08-19
    • 2018-10-06
    • 2010-12-29
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多