2011-01-17 16 views
2

Der Versuch, älter löschen Datensätze als 1 Monat von 2 Tabellen, wobei 1 verweist auf die Spalte "ID" in eine andere:PostgreSQL: Monat: = Intervall '30 Tage ';

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; 

aber irgendwie:

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 

Ich lese the doc, aber verstehe nicht, was mit meiner Deklaration falsch ist ...

+2

1 Monat ist nicht dasselbe wie 30 Tage: 12 Monate = 1 Jahr, 12 * 30 Tage = 360 Tage, 5 oder 6 Tage weniger als ein ganzes Jahr. Verwenden Sie '1 Monat', wenn Sie 1 Monat benötigen. –

Antwort

3

Sie müssen die Variable ‚Monat‘ erklären, nämlich .:

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

Auch Sie können wollen, um Ihre „where“ Kriterien erneut zu prüfen. Wenn QDATETIME eine indizierte Spalte ist, glaube ich nicht, dass sie den Index verwenden wird, wohingegen QDATETIME < (now() - month) dies tun würde.

+0

Danke. Ich dachte, DECLARE dient nur dazu, die Prozedurparameter zu deklarieren. –

2

Sie müssen die Variable deklarieren, bevor Sie sie verwenden können.

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

Aber ich würde mit Variablennamen vermeiden, die Wörter oder interne Funktionsnamen reserviert sind.

+0

seine Intervallsyntax ist korrekt. 'interval '30' days' ist kein gültiger Ausdruck ...' select interval '30' days 'erzeugt eine Spalte namens 'days' mit einem Wert von 30 Sekunden ... – araqnid

+0

' interval' 30 'day' ist der ANSI-Standard und wird von PostgreSQL unterstützt (Ich habe meinen Code mit PostgreSQL 9.0 getestet). Aber es scheint, dass PostgreSQL auch die Art und Weise unterstützt, wie das OP es geschrieben hat, was ich nicht wusste. –

+0

'do $$ Monat Intervall angeben; Beginn Monat: = Intervall '30' Tage; Erhöhe die Information '%', Monat; Ende; $$; '- Druckt ein Intervall von 30 Sekunden. – araqnid

Verwandte Themen