2011-01-17 17 views
2

2つのテーブルから1ヶ月よりも古いレコードを削除しようとすると、別のWHERE 1つの参照 "ID" 欄:PostgreSQL:月:=間隔'30日 ';

create or replace function quincytrack_clean() 
     returns void as $BODY$ 
     begin 
       month := interval '30 days'; 

       delete from hide_id 
       where id in 
       (select id from quincytrack 
       where age(QDATETIME) > month); 

       delete from quincytrack 
       where age(QDATETIME) > month; 
     end; 
$BODY$ language plpgsql; 

が、これはで失敗します。私はthe docを読んでいる

ERROR: syntax error at or near "month" 
LINE 1: month := interval '30 days' 
     ^
QUERY: month := interval '30 days' 
CONTEXT: SQL statement in PL/PgSQL function "quincytrack_clean" near line 2 

、宣言に何が問題なのか理解していない...

+2

1ヶ月は30日と同じではありません:12ヶ月= 1年、12 * 30日= 360日、5または6日未満の1年間。 1ヶ月が必要な場合は「1ヶ月」を使用してください。 –

答えて

3

あなたはすなわちは:また

declare 
    month interval; 
begin 
    month := interval '30 days'; 
end; 

、あなたは「どこ」の基準を再検討することをお勧めします、変数「月」を宣言する必要があります。 QDATETIMEがインデックス付きの列の場合、インデックスを使用するとは思われませんが、QDATETIME < (now() - month)となります。

+0

ありがとうございます。私はDECLAREがプロシージャのパラメータを宣言するためだけだと思った。 –

2

変数を宣言する必要があります。

 
... 
DECLARE 
    month INTERVAL; 
BEGIN 
    month := interval '30 days'; 
... 

しかし、私は予約語または内部関数名である変数名を使用しないでください。

+0

彼の区間構文は正しいです。 'interval '30' days'は有効な式ではありません...' select interval '30' days'は30秒の値を持つ 'days'という列を生成します... – araqnid

+0

' interval '30' day'はANSI標準であり、PostgreSQLでサポートされています(PostgreSQL 9.0で私のコードをテストしました)。しかし、PostgreSQLは、私が知らなかったOPがそれを書いた方法もサポートしているようです。 –

+0

'do $$月間を宣言します。開始月:=区間 '30'日;情報 '%'、月を作成します。終わり; $$; ' - 30秒の間隔を表示します。 – araqnid

関連する問題