2016-05-23 9 views
2

私はパラメータとして日付を取る関数をPostgreSQL 9.5に書こうとしています。私のテーブルには、inception_dateという列があります。この関数は、inception_dateが変数として提供された日付よりも大きいテーブルからすべての行を返すようにします。以下は私の関数である:私は他のデータ型よりもposgreSQL機能に異なる方法で処理された日付を言って任意の情報を見つけることができていないPostgreSQL関数で日付を変数として使用するにはどうすればよいですか?

CREATE OR REPLACE FUNCTION somefunc(date) RETURNS setof table AS 
    $BODY$ 
    DECLARE variable ALIAS FOR $1; 
    BEGIN 
    RETURN QUERY SELECT * FROM table WHERE inception_date > variable; 
    END; 
    $BODY$ 
    LANGUAGE 'plpgsql'; 

    SELECT somefunc('2014-07-02'); 

が、この機能は、任意の出力を表示しませんクエリしばらく

SELECT * FROM table WHERE inception_date > '2014-07-02'; 

は15行を返します。誰がここで間違っているかもしれないか知っていますか?

+0

実際に 'select somefunc( '2014-07-02');'と 'SELECT * FROM table WHERE inception_date> '2014-07-02';'は同じではありません。この関数は 'record 'クエリが個々の列を返すときに入力します。どのように結果を確認していますか? – Abelisto

+0

さて、関数定義にパラメータ名を入れるだけでなく、 "plpgsql"言語仕様を引用するのではなく、 "ALIAS FOR"を使用するのはちょっと古風ですが、作業。見た目には何かがありません。 "SELECT * FROM somefunc ..."で正しく呼び出すことから始めます。次に、(1)テーブル全体を返すだけで単純化し、(2)一定の日付に対して明示的にチェックします。それが何であるか教えてください。 –

+0

'inception_date'という列はどのような型ですか? –

答えて

0

ここでは、あなたのコードをPostgreSQLパーサーとは違って解釈します。あなたのために'2014-07-02 'は日付です。パーサーの場合、これはうっすらとしている。しかし、彼は素敵にしようとし、あなたが日付列をフィルタリングするためにそれを使用するのを見ると、それを日付として解釈しようとします。

しかし、「2014-07-02」と指定すると、7月の第2日の第7日か、7月の第2日ですか?彼はそれを知らない(そして私はどちらも知らない)。ですから、基本的にこれはあなたの側の誤りです。あなたはこのようにしてはいけません。

私が提案したいのは、日付型の名前付きパラメータで関数を作成し、それを日付として使用することです。次に、この関数を呼び出すときにstringをパラメータとして使用すると、この文字列をdateに変換してPostgreSQLに意味を伝えます。

以下のマニュアルの例と参照。ここで

CREATE OR REPLACE FUNCTION somefunc(p_date date) 
    RETURNS setof table 
    AS 
    $BODY$ 
     BEGIN 
      RETURN QUERY SELECT * FROM table WHERE inception_date > p_date; 
     END; 
    $BODY$ 
    LANGUAGE 'plpgsql'; 

    SELECT somefunc(to_date('2014-07-02','YYYY-MM-DD')); 

あなたはdate formattingcreating of functionsに関する詳細な情報を見つけることができます。

関連する問題