2017-04-27 40 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

爲什麼不'然後從那裏驅逐數據= date_part'month '' 人2016-11- 21');'?爲什麼功能?爲什麼它有常量?爲什麼即使columna名字是在常量之間?..你的目標是什麼? –

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

解釋見相關答案: