Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/07/2008, 23h16   #1
Membre à l'essai
 
Inscription : mars 2007
Messages : 64
Détails du profil
Informations personnelles :
Âge : 23

Informations forums :
Inscription : mars 2007
Messages : 64
Points : 23
Points : 23
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
cbalmefrezol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 00h21   #2
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 408
Points : 6 408
Bonjour,

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

ced
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 00h42   #3
Membre à l'essai
 
Inscription : mars 2007
Messages : 64
Détails du profil
Informations personnelles :
Âge : 23

Informations forums :
Inscription : mars 2007
Messages : 64
Points : 23
Points : 23
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
cbalmefrezol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 01h02   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 034
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 034
Points : 18 324
Points : 18 324
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 01h24   #5
Membre à l'essai
 
Inscription : mars 2007
Messages : 64
Détails du profil
Informations personnelles :
Âge : 23

Informations forums :
Inscription : mars 2007
Messages : 64
Points : 23
Points : 23
Citation:
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
cbalmefrezol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 09h33   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 034
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 034
Points : 18 324
Points : 18 324
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 09h36   #7
Membre régulier
 
Inscription : octobre 2006
Messages : 121
Détails du profil
Informations personnelles :
Âge : 61

Informations forums :
Inscription : octobre 2006
Messages : 121
Points : 90
Points : 90
Bonjour,
Ne pourrez t'on pas utiliser une procédure dans ce cas ?

Bonne journée
MS
MarcS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 11h07   #8
Membre à l'essai
 
Inscription : mars 2007
Messages : 64
Détails du profil
Informations personnelles :
Âge : 23

Informations forums :
Inscription : mars 2007
Messages : 64
Points : 23
Points : 23
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
cbalmefrezol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2008, 08h03   #9
Membre régulier
 
Inscription : octobre 2006
Messages : 121
Détails du profil
Informations personnelles :
Âge : 61

Informations forums :
Inscription : octobre 2006
Messages : 121
Points : 90
Points : 90
Bonjour,
Je pensais plutôt à une procédure ou une fonction,appelable dans une requête
Bonne journée
MS
MarcS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2008, 10h42   #10
Expert Confirmé
 
Avatar de Alain Defrance
 
Homme Alain DEFRANCE
Project Lead
Inscription : août 2007
Messages : 1 993
Détails du profil
Informations personnelles :
Nom : Homme Alain DEFRANCE
Âge : 24
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Project Lead

Informations forums :
Inscription : août 2007
Messages : 1 993
Points : 2 919
Points : 2 919
Envoyer un message via MSN à Alain Defrance Envoyer un message via Skype™ à Alain Defrance
Citation:
Ne pourrez t'on pas utiliser une procédure dans ce cas ?
Tout à fait

Citation:
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 - http://www.alain-defrance.com
Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
Project Lead eXo Social
Java Black Belt - Java Black Belt Coach
Alain Defrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2008, 00h00   #11
Membre à l'essai
 
Inscription : mars 2007
Messages : 64
Détails du profil
Informations personnelles :
Âge : 23

Informations forums :
Inscription : mars 2007
Messages : 64
Points : 23
Points : 23
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
cbalmefrezol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2008, 00h10   #12
Expert Confirmé
 
Avatar de Alain Defrance
 
Homme Alain DEFRANCE
Project Lead
Inscription : août 2007
Messages : 1 993
Détails du profil
Informations personnelles :
Nom : Homme Alain DEFRANCE
Âge : 24
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Project Lead

Informations forums :
Inscription : août 2007
Messages : 1 993
Points : 2 919
Points : 2 919
Envoyer un message via MSN à Alain Defrance Envoyer un message via Skype™ à Alain Defrance
Avec quelque chose du genre :

Code :
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 - http://www.alain-defrance.com
Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
Project Lead eXo Social
Java Black Belt - Java Black Belt Coach
Alain Defrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2008, 00h23   #13
Membre à l'essai
 
Inscription : mars 2007
Messages : 64
Détails du profil
Informations personnelles :
Âge : 23

Informations forums :
Inscription : mars 2007
Messages : 64
Points : 23
Points : 23
une question je tape ca dans phpmyadmin et c'est magique ca marche ou je doit passer par l'invité de commande?

laurent
cbalmefrezol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2008, 00h33   #14
Expert Confirmé
 
Avatar de Alain Defrance
 
Homme Alain DEFRANCE
Project Lead
Inscription : août 2007
Messages : 1 993
Détails du profil
Informations personnelles :
Nom : Homme Alain DEFRANCE
Âge : 24
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Project Lead

Informations forums :
Inscription : août 2007
Messages : 1 993
Points : 2 919
Points : 2 919
Envoyer un message via MSN à Alain Defrance Envoyer un message via Skype™ à Alain Defrance
Pour phpMyAdmin il faudra taper cela :

Code :
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 - http://www.alain-defrance.com
Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
Project Lead eXo Social
Java Black Belt - Java Black Belt Coach
Alain Defrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2008, 00h42   #15
Membre à l'essai
 
Inscription : mars 2007
Messages : 64
Détails du profil
Informations personnelles :
Âge : 23

Informations forums :
Inscription : mars 2007
Messages : 64
Points : 23
Points : 23
Code :
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?
cbalmefrezol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2008, 00h48   #16
Expert Confirmé
 
Avatar de Alain Defrance
 
Homme Alain DEFRANCE
Project Lead
Inscription : août 2007
Messages : 1 993
Détails du profil
Informations personnelles :
Nom : Homme Alain DEFRANCE
Âge : 24
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Project Lead

Informations forums :
Inscription : août 2007
Messages : 1 993
Points : 2 919
Points : 2 919
Envoyer un message via MSN à Alain Defrance Envoyer un message via Skype™ à Alain Defrance
Peut-tu montrer le script de création de la table afin que je puisse tester la requête ?
__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com
Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
Project Lead eXo Social
Java Black Belt - Java Black Belt Coach
Alain Defrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2008, 01h18   #17
Membre à l'essai
 
Inscription : mars 2007
Messages : 64
Détails du profil
Informations personnelles :
Âge : 23

Informations forums :
Inscription : mars 2007
Messages : 64
Points : 23
Points : 23
Code :
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 :
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)
cbalmefrezol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2008, 01h53   #18
Expert Confirmé
 
Avatar de Alain Defrance
 
Homme Alain DEFRANCE
Project Lead
Inscription : août 2007
Messages : 1 993
Détails du profil
Informations personnelles :
Nom : Homme Alain DEFRANCE
Âge : 24
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Project Lead

Informations forums :
Inscription : août 2007
Messages : 1 993
Points : 2 919
Points : 2 919
Envoyer un message via MSN à Alain Defrance Envoyer un message via Skype™ à Alain Defrance
Alors voici la procédure corrigé :

Code :
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 :
SELECT age_personne(4);
Si tu veux l'age sur une liste de personne :

Code :
SELECT age_personne(id_personne) FROM personne;
testé sous MySQL 5.0.32
__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com
Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
Project Lead eXo Social
Java Black Belt - Java Black Belt Coach
Alain Defrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2008, 15h27   #19
Membre à l'essai
 
Inscription : mars 2007
Messages : 64
Détails du profil
Informations personnelles :
Âge : 23

Informations forums :
Inscription : mars 2007
Messages : 64
Points : 23
Points : 23
merci bcp ca marche niquel!
cbalmefrezol est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h39.


 
 
 
 
Partenaires

Hébergement Web