Bonjour,
j'ai une liste de noms avec les dates de naissance correspondantes.
Je souhaite calculer l’âge de chaque personne (âge+nombre de mois).
j'ai trouvé un exemple dans la FAQ (signé Pierre Yves Samyn) mais je ne sais pas comment poser la requête et je ne trouve pas la commande SQL indiquée.
Comment faire ?
En attendant bonne fin d'année à toutes et tous.
Guy
Bonsoir,
Tu ne le précises pas, mais comme tu parles de SQL, je suppose que nous sommes dans Base?
Par ailleurs, tu ne précises pas non plus à partir de quand ton calcul doit incrémenter le compteur de mois ; est-ce que l'on compte lespériodes de 30 jours ? ou bien s'agit-il de décompter les mois civils et donc les périodes de 28 (ou 29), 30 et 31 jours exactement ? ou bien encore celles -moyennes- de 365,25/12 ?
Tes amies, dans ce domaine sont les fonctions suivantes :
- DATEDIFF(x,y) ; cette fonction te donnera le nombre de jours séparant la date x de la date y; c'est le résultat de la soustraction (x-y) ;
- CURDATE() ; te renvoie la date courante ; ça évite d'entrer une date en "dur" dans la requête et d'avoir à la modifier chaque fois que l'on veut s'en servir ;
- [a DIV b] ; c'est la fonction division entière ; par exemple "7 DIV 3" te renvoie 2 ; ici, elle servira à déterminer le nombre entier d'années écoulées, en pratiquant la division entière du résultat de DATEDIFF(x,y) par 365,25 (le nombre de jours dans une année) ; le problème (je crois) c'est que DIV n'est pas toujours très à l'aise avec certaines formes de nombres ; ainsi, la formule "365 DIV 365,25" renvoie-t-elle le résultat "1", ce qui est tout de même relativement inexact... ; ça peut-être gênant lorsque l'on est à la veille de la date anniversaire.
- MOD(a,b) ; cette fonction sort le reste de la division de a par b ; par exemple MOD(14,3) donne 2 (puisque 14 divisé par 3 donne 4 et il reste 2).
Encore faut-il savoir quel niveau de précision tu comptes atteindre ; est-ce qu'une erreur de un ou deux jours (impliquant donc qu'à certaines date particulières, le résultat anticipera ou retardera l'octroi d'un mois plein supplémentaire) est acceptable ou est-il indispensable que l'outil ne puisse jamais être pris en défaut ?
A+
Je n'ai pas prêté attention et n'ai donc pas percuté que l'exemple relevé était dans Base (que je ne maîtrise pas du tout).
j'ai essayé de calculer les âges dans calc en insérant la fonction Dates & Heures > Années
J'ai inséré la date initiale, la date de fin et le choix du mode se réduit à 0 pour le nombre d'années dans l'intervalle (1 pour les années de calendrier)
Je n'ai pas de résultat sinon "0"
Autrement je n'ai pas besoin d'un résultat deux jours près.
A +
Bonjour,
La fonction ANNEES devrait répondre à tes besoins
https://help.libreoffice.org/Calc/Add-in_Functions/fr#ANNEES
A+
Laurent BP
C'est celle que j'essaie d'utiliser vainement et qui me renvoie toujours au même résultat : 0 (que j'utilise le mode 0 ou 1).
J'ai vu dans la FAQ qu'il fallait que Addin analyse soit installé mais je ne l'ai pas trouvé sur internet.
Si la solution passe par cela quel est le lien?
A+
Guy
Bonjour,
Ok, ta question portait donc sur Calc.
Tu as plusieurs façon de procéder en réalité ; tu peux t'en remettre aux fonctions présentes dans le logiciel ou tu peux faire les calculs toi-même, à partir de ce que tu connais.
Les fonctions présentes dans le logiciel d'abord.
Dans une autre réponse, j'ai vu que Laurent Balland-Poirier t'orientait vers "Années" qui me semble effectivement l'une des voies possibles.
Tu as aussi une fonction DATEDIF qui a un objet proche ce que j'ai décrit précédemment pour SQL (attention, celle-là n'a qu'un seul "F" alors que celle de SQL en a deux) mais qui en est quand-même pas mal éloignée.
La structure de DATEDIF est la suivante : "=DATEDIF(x;y; z)" (sans les guillemets), avec les caractéristiques suivantes :
- x ; c'est la date de début de l'intervalle (autrement dit, la date la plus ancienne) ;
- y ; c'est la date de fin de l'intervalle (donc, la date la plus récente, évidemment) ; attention, si tu intervertis les deux date, la fonction te renverras un message d'erreur ;
- z ; c'est un argument de la fonction que ses concepteurs appellent l'intervalle ; il va te servir à déterminer ce que le résultat va représenter ; tu as le choix entre "y", "m", "d", "ym", "yd" et "md" (AVEC les guillemets) ; très classiquement, "y" va te donner le résultat en années entières, "m" en mois entiers et "d" en jours ; "ym" te donnera le nombre de mois entiers, après avoir ôté le nombre d'années entières (grosso modo, si tes dates sont 25/11/2010 et 27/12/2013, "ym" te donnera un résultat de 1 puisque l'intervalle représente 3 ans, 1 mois et 2 jours ; "yd" te donnera le nombre de jours écoulé au-delà de l'année entière (dans l'exemple précédent, ça te donnera 32, puisque la différence fait 3 ans et 32 jours) ; quant à "md", il te donnera le nombre de jours écoulé, au-delà du nombre de mois entiers, ce qui, dans notre exemple précédent, donnerait 2.
Donc pour obtenir ton résultat dans deux colonnes différentes, dans l'une tu mets ta formule avec "y" en argument et dans une seconde, la même formule avec "ym" en argument ; si tu veux avoir un truc joli, dans une seule cellule tu fais une concaténation du genre =concatener(datedif(a1;b1;"y");" ans ";"datedif(a1;b1;"ym");" mois") ; tu peux encore raffiner le truc en mettant des "si" si tu ne veux pas que "ans" apparaisse si le résultat de datedif(a1;b1;"y") est égal à 0 ou que le "s" final n'apparaisse pas si le résultat est égal à 1 mais là, c'est déjà du plus classique.
Il y a aussi moyen d'aboutir à ce genre de résultat avec des calculs relativement simples mais là je n'ai plus le temps, un rdv m'attend...
Bon courage.
bonjour,
pour calc, j'utilise cette formule:
=DATEDIF(B1;C1;"y")&" ans "&DATEDIF(B1;C1;"ym")&" mois
"&DATEDIF(B1;C1;"md")&" jours"
B1 : date de naissance
C1: date du jour, =MAINTENANT()
cdt
Seul problème : je n'ai pas cette fonction dans la liste du logiciel (LO 3.5.7.2)
C'est grave docteur?
A +
Bonjour,
De temps en temps je me réveille. Ce sujet très ancien, revient régulièrement, avec toujours les mêmes erreurs pour les calculs d'âges.
Voir ici :
http://christianwtd.free.fr/index.php?rubrique=DebFonctions02
plus précisément dans le paragraphe Attention au piège (2)
et d'autres formules ici :
http://christianwtd.free.fr/index.php?rubrique=AstucesCalc01#ExemplesFormules
Il est possible de tomber dans des cas particuliers, décrits dans une page programmation, avec une fonction DATE_DIF (qui n'existait pas encore dans les fonctions Calc). Voir le dernier paragraphe: Cas particulier
Le site est inactif depuis environ 2 ans, mais les formules devraient encore être utiles.
Bon surf,
Christian
Je ne reproduis pas ton problème. La fonction ANNEES est livrée par défaut. Quelle version de LibO utilises-tu ?
Quelle syntaxe exacte utilises-tu ?
Si la fonction te renvoie une valeur (0) c'est qu'elle est installée, sinon tu aurais un message d'erreur 
Tu as peut-être mal entré une valeur et celle-ci est considérée comme du texte. Pour le vérifier tu dois voir tes valeurs alignées par défaut sur la droite et, par exemple si tu ajoutes 1, la date doit se décaler d'un jour.
A+
Laurent BP
Ah, désolé ; je n'avais pas encore "reçu" cette réponse lorsque j'ai tapé la mienne à 11h07...
hello,
pas de problème, j'ai beaucoup apprécié votre réponse qui détaille la
fonction DATEDIF,
cordialement
Je reprend le cours des affaires.
J’utilise Lo 3.5.7.2!
En utilisant la fonction ANNÉES voici les différents résultats obtenus pour les écritures suivantes :
=ANNEES(15_02_1948;26_12_2013;0) m'affiche #NOM?
Pour :
=ANNEES(15/02/1948;26/12/2013;0) m'affiche 0 (même résultat avec 1)
Si je pose la formule suivante :
=ANNEES(15/02/1948;MAINTENANT();0) j'obtiens un résultat bizarre : 113 ce qui n'est pas la différence entre les deux dates.
De plus si je frappe à la main la formule fournie par cdT (laozi) à savoir :
=DATEDIF(B1;C1;"y")&" ans "&DATEDIF(B1;C1;"ym")&" mois
"&DATEDIF(B1;C1;"md")&" jours"
B1 : date de naissance
C1: date du jour, =MAINTENANT()
le résultat qui s'affiche est #NOM? et les majuscules deviennent minuscules.
J'ai fait un essai sur excel les majuscules restent dans la même forme et ça marche!
A +
Guy
Bonjour,
j'ai une liste de noms avec les dates de naissance correspondantes.
Je souhaite calculer l’âge de chaque personne (âge+nombre de mois).
j'ai trouvé un exemple dans la FAQ (signé Pierre Yves Samyn) mais je ne sais pas comment poser la requête et je ne trouve pas la commande SQL indiquée.
Comment faire ?
En attendant bonne fin d'année à toutes et tous.
Guy
Bonjour,
SI la date de naissance est en A1, cette formule calcule l'âge à la date d' aujourd'hui (testé avec LibO 4.1.4.2) :
=DATEDIF(A1;AUJOURDHUI();"y")&" ans "&DATEDIF(A1;AUJOURDHUI();"ym")&" mois "&DATEDIF(A1;AUJOURDHUI();"md")&" jours"
J.M
Bonjour
Guy GOURLAIN wrote
J’utilise Lo 3.5.7.2!
En utilisant la fonction ANNÉES voici les différents résultats obtenus
pour les écritures suivantes :
=ANNEES(15_02_1948;26_12_2013;0) m'affiche #NOM?
Pour :
=ANNEES(15/02/1948;26/12/2013;0) m'affiche 0 (même résultat avec 1)
Si je pose la formule suivante :
=ANNEES(15/02/1948;MAINTENANT();0) j'obtiens un résultat bizarre : 113
ce qui n'est pas la différence entre les deux dates.
De plus si je frappe à la main la formule fournie par cdT (laozi) à savoir
:=DATEDIF(B1;C1;"y")&" ans "&DATEDIF(B1;C1;"ym")&" mois
"&DATEDIF(B1;C1;"md")&" jours"B1 : date de naissance
C1: date du jour, =MAINTENANT()le résultat qui s'affiche est #NOM? et les majuscules deviennent
minuscules.
J'ai fait un essai sur excel les majuscules restent dans la même forme
et ça marche!
Tous ces résultats sont "normaux" avec ces syntaxes et ta version :
DATEDIF a été introduit avec la 3.6 cf.
https://wiki.documentfoundation.org/ReleaseNotes/3.6/fr#Calc
Les dates au format 15_02_1948 ne sont pas reconnues, elles sont
considérées comme du texte. En revanche tu peux utiliser (noter
le tiret - et non le _) :
=ANNEES("15-02-1948";"26-12-2013";0)
Si tu utilises par exemple :
=ANNEES(15/02/1948;26/12/2013;0)
Il est normal d'obtenir 0 car Calc fait la division 15 par 2 puis par 1948
puis 26/12 puis le résultat divisé par 2013. Tu obtiens des nombres
trop petits... 
Tu peux en revanche utiliser :
=ANNEES("15/2/1948";"26/12/2013";0)
113 est donc le résultat normal de ce qui suit :
=ANNEES(15/02/1948;MAINTENANT();0)
Calc calcule la différence entre 0 (ou à peu près, i.e. le résultat des
divisions) par rapport à aujourd'hui, à savoir 113 ans puisque la date
"origine" du tableur est le 30.12.1899
Cordialement
Pierre-Yves
Expliqué comme cela c'est désormais limpide.
merci à tous pour votre patience et votre soutien.
Bonne fin d'année!
Guy
Le piège de l'utilisation de l'opérateur division à la place du séparateur de date est indiqué dans l'aide de la fonction ESTBISSEXTILE :
https://help.libreoffice.org/Calc/Add-in_Functions/fr#Exemple_2
Ceci étant valable pour de nombreuses fonctions de date, il faudrait peut-être le déplacer pour le rendre + visible ?
Laurent BP
Bonjour Laurent
Laurent BALLAND-POIRIER wrote
Le piège de l'utilisation de l'opérateur division à la place du
séparateur de date est indiqué dans l'aide de la fonction ESTBISSEXTILE :
https://help.libreoffice.org/Calc/Add-in_Functions/fr#Exemple_2Ceci étant valable pour de nombreuses fonctions de date, il faudrait
peut-être le déplacer pour le rendre + visible ?
Oui, pourrait être au début, cf ce qui est fait pour le jour zéro.
De même, l'add-in faisant partie de l'install il me semble incorrect de
ne pas citer ses fonctions de date ici:
https://help.libreoffice.org/Calc/Date_and_Time_Functions/fr
Au *minimum* sous forme de renvoi avec en plus un lien dans Related Topics
Cordialement
Pierre-Yves
Il pourrait aussi y avoir une page consacrée à la saisie et à l'utilisation des dates dans des formules.
Bonsoir Guy
Et bonne année
Bonjour,
La fonction ANNEES devrait répondre à tes besoins
https://help.libreoffice.org/Calc/Add-in_Functions/fr#ANNEESA+
Laurent BP
C'est celle que j'essaie d'utiliser vainement et qui me renvoie toujours au même résultat : 0 (que j'utilise le mode 0 ou 1).
J'ai vu dans la FAQ qu'il fallait que Addin analyse soit installé mais je ne l'ai pas trouvé sur internet.
Si la solution passe par cela quel est le lien?
A+
GuyJe ne reproduis pas ton problème. La fonction ANNEES est livrée par
défaut. Quelle version de LibO utilises-tu ?
Quelle syntaxe exacte utilises-tu ?
Si la fonction te renvoie une valeur (0) c'est qu'elle est installée,sinon tu aurais un message d'erreur
Tu as peut-être mal entré une valeur et celle-ci est considérée comme du texte. Pour le vérifier tu dois voir tes valeurs alignées par défaut sur la droite et, par exemple si tu ajoutes 1, la date doit sedécaler d'un jour.
A+
Laurent BP
Je reprend le cours des affaires.
J’utilise Lo 3.5.7.2!
En utilisant la fonction ANNÉES voici les différents résultats obtenus pour les écritures suivantes :
=ANNEES(15_02_1948;26_12_2013;0) m'affiche #NOM?
Pour :
=ANNEES(15/02/1948;26/12/2013;0) m'affiche 0 (même résultat avec 1)
Si je pose la formule suivante :
=ANNEES(15/02/1948;MAINTENANT();0) j'obtiens un résultat bizarre : 113 ce qui n'est pas la différence entre les deux dates.
De plus si je frappe à la main la formule fournie par cdT (laozi) à savoir :=DATEDIF(B1;C1;"y")&" ans "&DATEDIF(B1;C1;"ym")&" mois
"&DATEDIF(B1;C1;"md")&" jours"B1 : date de naissance
C1: date du jour, =MAINTENANT()le résultat qui s'affiche est #NOM? et les majuscules deviennent minuscules.
J'ai fait un essai sur excel les majuscules restent dans la même forme et ça marche!
A +
Guy
Non, cela ne marche pas. Car tous les tableurs fonctionnent de la même manière et ce serait sympa de ne pas dire
des choses fausses et surtout le "ça marche sur Excel" que j'ai du mal à accepter lorsque c'est faux.
Ta première syntaxe sur Excel écrit du texte, normal
Et les 2 autres renvoient #Nom car la fonction dans Excel s'écrit avec un accent "=Année()
L'important cependant est que tu aies trouvé la solution...
Et le simple "je ne sais pas faire" est tout à fait honorable et largement acceptée sur cette liste.
Marie-Jo