Bonjour,
La procédure PROC_AGE_INDIVIDU donne un âge en jours. Mais avant toute chose, j'attire votre attention sur la précision relative de cet âge.
Il ne peut être juste que si la date de naissance et la date de décès exactes sont connues. En l'absence de l'événement décès, c'est la date du jour qui est utilisée (ce qui explique le nombre de centenaires que vous devez trouver
).
Lorsque les dates ne sont pas complètes, les approximations suivantes sont utilisées:
Si le mois est connu on estime que l'événement a eu lieu le 15 de ce mois. Si seule l'année est connue, on estime que l'événement a eu lieu le 1 juillet de cette année.
Quand la date est exprimée sous forme de période (entre xxxx et xxxx, avant le xxxx) c'est toujours la première des dates qui est prise en compte.
L'âge en jours est donc déjà à considérer avec un certain recul.
En considérant que ce nombre de jours soit exact, sa transformation en années, mois, jours n'est pas si évidente qu'il y paraît.
Transformer un nombre de jours en semaines-jours est simple: il suffit de diviser par 7 pour obtenir la nombre de semaines, le reste de la division donnant le nombre de jours.
Mais pour le transformer en années, sans perdre la précision du jour? Il faudrait connaître le nombre d'années bissextiles qui se sont écoulées entre la naissance et le décès. Le calcul se complique encore si on prend en compte les mois.
Voilà pourquoi le résultat de la PROC_AGE_INDIVU est "traité" en interne avant de l'afficher dans Ancestrologie sous la forme années-mois, (en éliminant au passage les âges improbables), probablement en utilisant pour le calcul une année moyenne de 365.24 jours et un mois de 1/12ième de l'année. La précision de cet affichage étant largement suffisante en regard de la précision de l'âge.
Faire ce calcul dans une requête est sans doûte possible, mais pas simple. Si certains veulent essayer, pour le fun...
Pour les SQLogues qui veulent s'amuser, au lieu de faire ce calcul directement dans la requête simple présentée ci-dessus, depuis la version 2.0 de Firebird, le langage s'est enrichie d'une structure "Execute block" qui autorise l'écriture de requêtes utilisant des instructions d'habitude réservées aux procédures stockées (comme des conditions et des boucles...). Cette structure est décrite dans les notes de versions (document pdf) accompagnant Firebird.
A+
André