2017-05-13 12 views
1

私はSQLを初めて使い、PostgreSQLで、人物が "yymmdd"の文字列 "personalNumber"から大人であるかどうかをチェックするトリガーを作成したいと思います。 私は年齢()関数で使用できるように、文字列からタイムスタンプを作成する方法を見つけることができません。PostgreSQLで年齢を取得する方法

ここまでは私のコードです。私は年齢の最初の入力変数が間違っていることを知っているが、私はそれを動作させる方法を見つけることができません。

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

注意をあなたが保存結果は明日までに時代遅れされること、および依存するデータを格納する[第2正規形]に違反:構築し、ちょうどそれを直接割り当てることができますSecond_normal_form)。誕生日を保存し、必要な時に年齢を計算する方がよいでしょう。 – Andomar

答えて

2

あなたはタイムスタンプにこの文字列を変換するto_timestamp機能を使用し、それにageを適用することができます。あなたは18年の間隔に対してそれをチェックする必要があると思いますので、age間隔ではなく、整数を返すことに注意してください:

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

isadultbooleanているので、あなたはのif-elseを必要としないことhttps://en.wikipedia.org/wiki/(

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

ありがとう!私は、全体が1つの単純な行に収まるとは思っていませんでした。 :) –

関連する問題