Probleme mit Zeitoperationen

Hi!

Ich habe mal wieder ein Problem mit Zeitoperationen. Ich habe eine Tabelle mit einer Spalte “birthday” vom Typ “date”. Dieses Feld will ich nun mit einem trigger überprüfen, dafür habe ich mir eine Funktion geschrieben welche aber leider einen Syntaxfehler erzeugt.

Die Funktion:

CREATE OR REPLACE FUNCTION check_birthday() RETURNS "trigger" AS '
BEGIN
  IF NEW.birthday (CURRENT_DATE - INTERVAL '123 YEARS') THEN
    RAISE EXCEPTION ''nobody is older than 123 years'';
  IF NEW.birthday (CURRENT_DATE - INTERVAL '18 YEARS') THEN
    RAISE EXCEPTION ''is not full aged'';
END;
' LANGUAGE 'plpgsql';

CREATE TRIGGER check_birthday BEFORE INSERT OR UPDATE ON customer
  FOR EACH ROW EXECUTE PROCEDURE check_birthday();

Der Syntaxfehler:

ERROR: syntax error at or near "123"

Laut Dokumentation (link) müsste die Syntax aber richtig sein und meine Versuche bringen keine besseren Ergebnisse. Hat jemand eine Idee oder weiss jemand die richtige Lösung?

Anmerkung: Jep man könnte statt der Funktion auch ein check Constraint verwenden, aber aus bestimmten Gründen ist hier ein Trigger erwünscht.

Hallo SeboStone,

IF NEW.birthday (CURRENT_DATE - INTERVAL ‘123 YEARS’) THEN



IF NEW.birthday (CURRENT_DATE - INTERVAL ‘18 YEARS’) THEN

Ohne einen Operator würde ich auch meckern!

Statt “AS '” solltest Du “AS $BODY$” oder ähnliches verwenden. Dann hast Du die Probleme mit den mehrfach “'” nicht!



mfg

fristo

Hi!

Der Operator ist drin ich weiss auch nicht was hier beim kopieren schief gegangen ist. Definitiv sieht mein Statement folgendermassen aus:

IF NEW.birthday <CURRENT_DATE> (CURRENT_DATE - INTERVAL '18 YEARS') THEN

So ein Mist, wenn ich meinen Code einfach reinkopiere und den Beitrag abschicke wird daraus dieser Quatsch?! Keine Ahnung was das phpBB da anstellt. Anstatt <CURRENT_DATE> steht bei mir einfach nur ein größerals bzw. kleinerals.

Aber ich habe jetzt kapiert wo der Fehler war. Danke Dir! :slight_smile:

Hallo SeboStone,

Das Forum ist eigentlich dafür da, dass jeder jedem hilf. Da wäre es auch hilfreich wenn Du deinen Fehler hier mal beschreibst.


mfg

fristo

IF NEW.birthday < (CURRENT_DATE - INTERVAL ''123 YEARS'') THEN

Deshalb verwende ich auch $BODY$ und nicht ’ als Begrenzung für die Funktion.


mfg

fristo