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 MySQL Discussion :

Champs de type formule


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Points : 57
    Points
    57
    Par défaut Champs de type formule
    Bonjour,

    Voilà mon problème est le suivant j'aimerai créer de façon permananante des champs de type formule (comme excel)

    Exemple un champ 'age_personne' dans la table personne :

    (TO_DAYS(NOW())-TO_DAYS(date_naiss_personne))/365

    etc..

    je voulais savoir si c'est possible ou suis-je obligé de gérer ca dans mon programme lors du requettage?

    merci d'avance

    (PS: sans utiliser les vues)

    Laurent

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    C'est le stockage de la formule ou le résultat que tu souhaites ?

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Points : 57
    Points
    57
    Par défaut
    en faite je souhaiterai plutot le résultat:

    exemple: si la personne est arrivée au monde le 08/06/1988

    age_personne affichera 20

    merci d'avance de me dire si c'est possible ou pas? (j'ai moi même des doutes mais je préfère demander)

    Laurent

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    En bonne conception on ne stocke pas les calculs, sauf si le résultat doit être archivé.
    Pour un âge, je ne pense pas que ce soit le cas.
    Tu stocke la date de naissance et au moment où tu as besoin de la donnée, tu peux facilement calculer l'âge avec le langage de ton application ou directement par la requête MySQL.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Points : 57
    Points
    57
    Par défaut
    En bonne conception on ne stocke pas les calculs, sauf si le résultat doit être archivé.
    Je n'en doute pas du tout! je suis le premier à prêcher cela!

    Mais le problème vient que plusieurs programmes peuvent utiliser la même base de données! Et je ne souhaite pas que ce soit les programmeurs qui gèrent ça (pour des raison de validité des données), mais je préfère que cela soit géré par la base de données (un peu comme un tableur).

    Je vous remercie

    Laurent

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par cbalmefrezol Voir le message
    (pour des raison de validité des données)
    Justement ! La donnée toujours valide, c'est la date de naissance et en principe elle ne change jamais, sauf erreur de saisie. Alors que l'âge, par définition, change chaque année !

    Sauf à mettre à jour une colonne âge toutes les nuits par une procédure automatique, je ne vois pas comment garder un âge fiable en base de données.

    Sinon il est bien sûr possible de stocker dans un VARCHAR une formule littérale qui contient un morceau de SQL mais il faut sortir ça de la table 'personne' sinon c'est la même formule qui est répétée sur toutes les lignes. Ce que je suggère est une table qui pourrait s'appeler 'Règles' et ayant la structure suivante :
    - RegleId
    - RegleLibelle
    - RegleCommentaire
    - RegleFormule
    La colonne RegleFormule contiendrait dans le cas qui te préoccupe le morceau de SQL à utiliser obligatoirement par les programmeurs pour calculer l'âge d'une personne.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 73

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 126
    Points
    126
    Par défaut
    Bonjour,
    Ne pourrez t'on pas utiliser une procédure dans ce cas ?

    Bonne journée
    MS

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Points : 57
    Points
    57
    Par défaut
    oui je pense que passer par des triggers peut être une bonne idée !

    je vais me renseigner de ce côté.


    Merci d'avance

    Laurent

  9. #9
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 73

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 126
    Points
    126
    Par défaut
    Bonjour,
    Je pensais plutôt à une procédure ou une fonction,appelable dans une requête
    Bonne journée
    MS

  10. #10
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    Ne pourrez t'on pas utiliser une procédure dans ce cas ?
    Tout à fait

    oui je pense que passer par des triggers peut être une bonne idée !
    Attention, trigger et procédure ce n'est pas la même chose, même si ça fait appel au même langage.
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Points : 57
    Points
    57
    Par défaut
    ah?

    je vais peut-être vous paraître un cancre mais comment on peut faire, par exemple un procédure qui retourne age_personne à partir de la formule suivante : (TO_DAYS(NOW())-TO_DAYS(date_naiss_personne))/365

    et l'utiliser facilement?
    SELECT age_personne() FROM personne?

    merci d'avance pour les lumières que vous allez m'apporter

    Laurent

  12. #12
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    Avec quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE FUNCTION age_personne() RETURN INTEGER
    BEGIN
        RETURN SELECT (TO_DAYS(NOW())-TO_DAYS(date_naiss_personne))/365 FROM personne;
    END;
    (code non testé)
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Points : 57
    Points
    57
    Par défaut
    une question je tape ca dans phpmyadmin et c'est magique ca marche ou je doit passer par l'invité de commande?

    laurent

  14. #14
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    Pour phpMyAdmin il faudra taper cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE FUNCTION age_personne() RETURN INTEGER
    BEGIN
        RETURN SELECT (TO_DAYS(NOW())-TO_DAYS(date_naiss_personne))/365 FROM personne;
    END;
    //
    Et ne pas oublier de spécifier le délimiteur // dans la fenêtre qui sert a exécuter le code SQL.
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Points : 57
    Points
    57
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     MySQL a répondu:Documentation
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'RETURN INTEGER
    BEGIN
        RETURN SELECT (TO_DAYS(NOW())-TO_DAYS(date_naiss_pers' at line 1
    Je ne comprends pas il me retourne une erreur alors que j'ai bien indiqué // comme délimiteur une idée?

  16. #16
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    Peut-tu montrer le script de création de la table afin que je puisse tester la requête ?
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Points : 57
    Points
    57
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    -- phpMyAdmin SQL Dump
    -- version 2.11.6
    -- http://www.phpmyadmin.net
    --
    -- Serveur: localhost
    -- Généré le : Ven 04 Juillet 2008 à 01:15
    -- Version du serveur: 5.0.51
    -- Version de PHP: 5.2.6
     
    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
     
    --
    -- Base de données: `charlon`
    --
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `personne`
    --
     
    CREATE TABLE `personne` (
      `id_personne` int(11) NOT NULL auto_increment,
      `nom_personne` varchar(256) default NULL,
      `prenom_personne` varchar(256) default NULL,
      `date_entree` date default NULL,
      `date_sortie_personne` date default NULL,
      `secu_personne` varchar(45) default NULL,
      `date_visite_medicale_personne` date NOT NULL,
      `type_personne` varchar(256) default NULL,
      `secteur_activite` varchar(256) default NULL,
      `place_num_personne` int(11) default NULL,
      `mobile_prof` varchar(20) default NULL,
      `badge` int(3) default NULL,
      `carte_gasoil_personne` varchar(3) default NULL,
      `num_chauff` int(11) default NULL,
      `date_naiss` date default NULL,
      `lieu_naiss_personne` varchar(256) NOT NULL,
      `nationnalite` varchar(256) default NULL,
      `email_personne` varchar(256) default NULL,
      `diplome` varchar(256) default NULL,
      `date_control_vehicule` date default NULL,
      `maj_livret` date default NULL,
      `code_site_personne` int(11) default NULL,
      `observations_personne` text,
      `taille_pointure` varchar(256) default NULL,
      `gants_hydro_plus` date default NULL,
      `gants_hydro` date default NULL,
      `gants_plus` date default NULL,
      `gants` date default NULL,
      `chaussures_plus` date default NULL,
      `chaussures` date default NULL,
      `casque_lun_masque` date default NULL,
      `baudrier` date default NULL,
      `observations_epi` text,
      `ville_personne2` varchar(256) default NULL,
      `cp_personne2` int(5) default NULL,
      `adr_personne2` varchar(256) default NULL,
      `adr_suite_personne2` varchar(256) NOT NULL,
      `observations_adresse_personne2` text,
      `ville_personne1` varchar(256) default NULL,
      `cp_personne1` int(5) default NULL,
      `adr_personne1` varchar(256) default NULL,
      `adr_suite_personne1` varchar(256) NOT NULL,
      `observations_adresse_personne1` text,
      `num_telephone_personne1` varchar(20) default NULL,
      `observations_telephone_personne1` text,
      `num_telephone_personne2` varchar(20) default NULL,
      `observations_telephone_personne2` text,
      `num_telephone_personne3` varchar(20) NOT NULL,
      `observations_telephone_personne3` text NOT NULL,
      `num_fcos` varchar(256) NOT NULL,
      `validite_fcos` date default NULL,
      `num_caces` varchar(256) NOT NULL,
      `denomination_caces` varchar(256) default NULL,
      `validite_caces` date default NULL,
      `observations_caces` text,
      `validite_citerne` date default NULL,
      `validite_base` date default NULL,
      `validite_petrol` date default NULL,
      `num_valise_adr` varchar(256) default NULL,
      `plomb_valise` varchar(256) default NULL,
      `verif_valise_adr` varchar(10) default NULL,
      `num_md` varchar(256) NOT NULL,
      `num_permis` varchar(20) NOT NULL,
      `validite_permis` date default NULL,
      `delivre_date_permis` date default NULL,
      `delivre_par_permis` varchar(256) default NULL,
      `ec_date` date default NULL,
      `num_carte_conducteur` varchar(256) default NULL,
      `date_emission_carte_conducteur` date default NULL,
      `date_expiration_carte_conducteur` date default NULL,
      `fimo_personne` varchar(256) NOT NULL,
      PRIMARY KEY  (`id_personne`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=86 ;

    Note que j'ai fais une erreur c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE FUNCTION age_personne() RETURN INTEGER
    BEGIN
        RETURN SELECT (TO_DAYS(NOW())-TO_DAYS(date_naiss))/365 FROM personne;
    END;
    date_naiss remplace date_naiss_personne


    Merci pour tout ce temps que tu me consacre

    PS: j'ai essayé avec MYSQL GUI Tools tjrs impossible d'ajouter (même message d'erreur)

  18. #18
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    Alors voici la procédure corrigé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE FUNCTION age_personne(p_id_personne INTEGER) RETURNS INTEGER DETERMINISTIC
    BEGIN
        DECLARE age FLOAT;
        SELECT (TO_DAYS(NOW())-TO_DAYS(date_naiss))/365 INTO age FROM personne WHERE id_personne = p_id_personne;
        RETURN FLOOR(age);
    END;
    //
    (Attention a ne pas oublier de délimiteur).

    Pour l'utiliser si tu veux l'age d'une personne en particulier, par exemple d'identifiant 4 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT age_personne(4);
    Si tu veux l'age sur une liste de personne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT age_personne(id_personne) FROM personne;
    testé sous MySQL 5.0.32
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Points : 57
    Points
    57
    Par défaut
    merci bcp ca marche niquel!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MIGRATION] champ de type "case à cocher"
    Par The_Nail dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 10/05/2011, 11h07
  2. Pb de formatage de champs de type float
    Par FrankyNormand dans le forum XMLRAD
    Réponses: 9
    Dernier message: 05/05/2005, 12h37
  3. Fonction LEFT sur champ de type "text" : méthodes
    Par MatthieuQ dans le forum Langage SQL
    Réponses: 4
    Dernier message: 08/06/2004, 11h15
  4. Champ de type +
    Par semaj_james dans le forum Bases de données
    Réponses: 5
    Dernier message: 02/06/2004, 14h08
  5. Valeur par defaut 'True' dans un champ de type bit
    Par Mouse dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/03/2003, 15h26

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