IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Avril 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2019
    Messages : 5
    Par défaut 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;
    Nom : Capturedevelop1405.PNG
Affichages : 209
Taille : 40,9 Ko

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

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    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 +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 164
    Par défaut
    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/curr...-datetime.html

    Cordialement,

Discussions similaires

  1. Trigger avec variable dans une requete
    Par Lafite84 dans le forum Développement
    Réponses: 5
    Dernier message: 29/07/2019, 10h55
  2. Réponses: 7
    Dernier message: 22/04/2015, 07h57
  3. TRIGGER - DELETE dans FOR UPDATE ne passe pas dans INSTEAD OF DELETE
    Par stephane.julien dans le forum MS SQL Server
    Réponses: 19
    Dernier message: 22/06/2011, 13h54
  4. Validation avec un post ajax ne passe pas dans certains navigateurs
    Par Lucas Panny dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 05/12/2010, 19h28
  5. Ctrl -] ne passe pas dans une console avec vim
    Par Celelibi dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 10/03/2006, 13h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo