2017-05-13 1 views
1

Ich bin neu in der SQL und ich möchte einen Trigger in PostgreSQL erstellen, die überprüft, ob eine Person adult von Zeichenfolge "PersonalNumber" ist, die im Format "Yymmdd" ist. Mein Problem ist, ich kann keine Möglichkeit finden, einen Zeitstempel aus der Zeichenfolge zu erstellen, damit ich es in der Funktion age() verwenden kann.Wie man Alter in PostgreSQL

Hier ist mein Code so weit. Ich weiß, dass ich das Alter der Eingabevariablen anfangs falsch eingegeben habe, aber ich finde einfach keinen Weg es zum Laufen zu bringen.

CREATE FUNCTION is_person_adult() RETURNS trigger AS $person$ 
BEGIN 

    IF age(substr(new."personalNumber", 0, 2) + "-" + substr(new."personalNumber", 2, 4) + "-" + substr(new."personalNumber", 4, 6), current_date) > 18 THEN 
    new.isadult = TRUE; 
    ELSE 
    new.isadult := FALSE; 
    END IF; 
END; 
$person$ LANGUAGE plpgsql; 

CREATE TRIGGER person_stamp BEFORE INSERT OR UPDATE ON person 
FOR EACH ROW EXECUTE PROCEDURE is_person_adult(); 
+2

Beachten Sie, dass das Ergebnis, das Sie speichern, werden von morgen überholt sein, und abhängige Daten verletzt [zweite Normalform] speichern (https://en.wikipedia.org/wiki/ Zweite_normale_form). Es ist besser, den Geburtstag zu speichern und das Alter zum gewünschten Zeitpunkt zu berechnen. – Andomar

Antwort

2

können Sie verwenden, um die Funktion to_timestamp diese Zeichenfolge an einem Zeitstempel zu konvertieren, und dann age für sie gelten. Beachten Sie, dass age ein Intervall zurückgibt, nicht eine ganze Zahl, so müssten Sie es gegen ein Intervall von 18 Jahren zu überprüfen:

IF AGE(TO_TIMESTAMP(new.personalNumber, 'yymmdd')) > INTERVAL '18 years' THEN 
    new.isadult := TRUE; 
ELSE 
    new.isadult := FALSE; 
END IF; 

Beachten Sie, dass seit isadult eine boolean ist, müssen Sie nicht die if-else brauchen konstruieren, und es könnte nur direkt zuordnen:

new.isadult := 
    (AGE(TO_TIMESTAMP(new.personalNumber, 'yymmdd')) > INTERVAL '18 years'); 
+1

Vielen Dank! Ich hatte keine Ahnung, dass die ganze Sache in eine einfache Reihe passen könnte. :) –

Verwandte Themen