Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

Trigger avec Timestamp dans MySQL ne passe pas dans PostGreSQL


Sujet :

Requêtes PostgreSQL

  1. #1
    Futur Membre du Club
    Trigger avec Timestamp dans MySQL ne passe pas dans PostGreSQL
    Bonjour,
    Comme l'indique le titre j'essaie d'adapter ce trigger simple MySQL vers PostGreSQL(pour calculer l'âge en années en fonction de la date de naissance et la date du jour):

    Dans MySQL:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE DEFINER=`root`@`%` TRIGGER `patient_age_insert` BEFORE INSERT ON `patient` FOR EACH ROW
    BEGIN
        IF (NEW.`age` IS NULL) THEN
            SET NEW.`age` = timestampdiff(YEAR,NEW.`birthdate`,now());
        END IF;
    END



    Dans Pg je créé une fonction en premier qui appellera le trigger mais je suis bloqué:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE FUNCTION patient_age_insert() RETURNS trigger AS $$
    BEGIN
      IF 
      (NEW.age IS NULL) 
      THEN
      SET NEW.age = DATE_PART('year', 'NEW.birthdate'::date) - DATE_PART('year', 'CURRENT_DATE'::date);;
      END IF;
      RETURN NEW;
    END $$ LANGUAGE plpgsql;




    Mais je pense que le DATE_PART est mal écrit??

  2. #2
    Rédacteur

    De toute façon votre algorithme de calcul d'âge est faux et ne donnera l'âge réel que dans 50% des cas….

    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  3. #3
    Membre actif
    Bonjour,

    Pour calculer l'age le plus simple à mon avis est d'utiliser la fonction AGE comme cela :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    EXTRACT('year' FROM AGE(NOW(), birthdate))

    Cette fonction AGE peut d'ailleurs fonctionner avec un seul argument pour comparer à la date du jour à minuit.

    Après c'est un peu bizarre le fait de le mettre dans un trigger.
    Si c'est pour juste afficher l'age du patient le mieux est de recalculer à chaque fois : c'est très rapide et cela sera toujours à jour.
    Si par exemple pour stocker l'age à une date de consultation (par exemple), plutôt que stocker l'age, mieux vaudrait stocker séparément la date de consultation et l'age. Il sera possible de recalculer l'age très facilement et en plus on conserve les dates.

    Doc : https://www.postgresql.org/docs/current/functions-datetime.html

    Cordialement,