2017-04-27 3 views
0

日付が指定された月以内のテーブルから人を選択したいと思います。
これは私がこれまで持っているものであるが、それは働いていない:あなたがやろうとしている何のため関数のWHERE句の日付部分

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

2016-11-:

は、説明のために、関連の回答を参照してください。 21 '); '' ..なぜ機能するの?なぜそれは定数を持っていますか?あなたの目標は何ですか?.. –

+1

これらの恐ろしいバックティックは、Postgresで無効です。文字列定数は一重引用符で囲む必要があります: '' data ''https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-CONSTANTS –

+0

また、参照していますパラメータ '$ 1'がありますが、あなたの関数はパラメータで宣言されていません。 –

答えて

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のインデックスを使用できませんでした。なぜ ` '' どこのデータ= date_part'month追放から人物を選択していない

関連する問題