LibO 3.5 SouS XP Base requête calcul age

Bonjour;
j'écris une requête pour calculer des âges : et le résultat *age *est un "alias"

DATEDIFF( 'year', [date de naissance], NOW( ) )

  * 1ere question : est-il possible de récupérer le résultat dans un
    champ d'une table ? (pour pouvoir le récupérer éventuellement dans
    une autre requête , un rapport etc ...)

  * 2ème question : j'introduis dans les critères une condition > 60 par
    exemple. 9a fonctionne les personnes dont les ages sont supérieurs à
    60 sont listées dans ma requête. Cependant quand je reviens en
    édition sur cette requête mon critère à disparu...sauf que la
    requête donne un résultat conforme à ce critère.

Si je regarde le SQL , je vois bien que le critère est bien présent, à tel point que si j'ajoute un autre critère > 40 celui-ci se retrouve dans le code SQL et s'ajoute au précédent (>60)/

  * 3ème question: dans la ligne critère quel calcul sur les champs de
    type Date peut-on effectuer. (me renvoyer éventuellement à un Wiki)

D'avance merci

Bonjour Claude,

Je suppose que tu travailles avec le HSQL intégré ?

Bonjour;
j'écris une requête pour calculer des âges : et le résultat *age *est un "alias"

DATEDIFF( 'year', [date de naissance], NOW( ) )

* 1ere question : est-il possible de récupérer le résultat dans un
   champ d'une table ? (pour pouvoir le récupérer éventuellement dans
   une autre requête , un rapport etc ...)

Avec l'instruction UPDATE table SET champ_recup = ... etc. mais les instructions UPDATE, DELETE, INSERT ne peuvent être exécutées qu'en SQL direct (Outils > SQL)

* 2ème question : j'introduis dans les critères une condition > 60 par
   exemple. 9a fonctionne les personnes dont les ages sont supérieurs à
   60 sont listées dans ma requête. Cependant quand je reviens en
   édition sur cette requête mon critère à disparu...sauf que la
   requête donne un résultat conforme à ce critère.

Si je regarde le SQL , je vois bien que le critère est bien présent, à tel point que si j'ajoute un autre critère > 40 celui-ci se retrouve dans le code SQL et s'ajoute au précédent (>60)/

Je n'ai pas trop le temps pour essayer de reproduire, peut-être y-a-t-il un bug ? En plus je n'utilise jamais l'assistant, j'écris les requêtes directement en SQL.

* 3ème question: dans la ligne critère quel calcul sur les champs de
   type Date peut-on effectuer. (me renvoyer éventuellement à un Wiki)

Pour HSQLDB : http://wiki.openoffice.org/wiki/FR/Documentation/HSQLDB_Guide/ch09#Les_fonctions_int.C3.A9gr.C3.A9es_et_proc.C3.A9dures_stock.C3.A9es

Bernard

Merci Bernard pour ta réponse.
Je travaille effectivement avec HSQL intégré.

Lorsque tu dis :
/"Avec l'instruction UPDATE table SET champ_recup = ... etc. mais les instructions UPDATE, DELETE, INSERT ne peuvent être exécutées qu'en SQL direct (Outils > SQL)/", veux-tu dire que si je créé une requête SQL je peux utiliser les instructions citées? ce que je pense.
A titre personnel je vais regarder ce que je pourrai faire en écrivant une requête SQL, il reste et ça déjà été dit sur ce forum lorsque j'essaie de montrer comment créer une base simple à des "élèves" de l'association, je ne peux me permettre de dire de passer par le SQL pour faire telle ou telle chose, c'est irrecevable pour eux.
A+

Claude

Lorsque tu dis :
/"Avec l'instruction UPDATE table SET champ_recup = ... etc. mais les instructions UPDATE, DELETE, INSERT ne peuvent être exécutées qu'en SQL direct (Outils > SQL)/", veux-tu dire que si je créé une requête SQL je peux utiliser les instructions citées? ce que je pense.

si je créé une requête SQL je NE peux PAS utiliser les instructions citées

je ne peux me permettre de dire de passer par le SQL pour faire telle ou telle chose, c'est irrecevable pour eux.

Grosse lacune du module Base.
À partir d'un formulaire il faut passer par une macro pour exécuter ce genre d'instructions SQL. C'est sûr que pour tes élèves et pour beaucoup (moi-même) les macros Basic ce n'est pas évident.
Je n'utilise plus HSQL mais MySQL et les triggers/procédures stockées pour faire ce genre d'opérations.
Il me semble me souvenir que la version de HSQL supérieure à celle implémentée dans Lo gère les triggers. Dommage.

Bernard

Lorsque dans ce wiki:
https://wiki.documentfoundation.org/FR/FAQ/Base/121
je vois des instructions SQL quel environnement faut-il ?
si j'édite en SQL ma requête de calcul des âges puis-je la modifier pour obtenir un champ age qui soit défini par le résulta de DATEDIFF (....
Les instructions actuellement dans ma requête:
SELECT DATEDIFF( 'year', "date de naissance", NOW( ) ) AS "age", "date de naissance", "ID", "NOM", "prénom", "activité", "Adresse", "Code Postal", "VILLE" FROM "MON ANNUAIRE" AS "MON ANNUAIRE"
merci

Claude

Lorsque dans ce wiki:
https://wiki.documentfoundation.org/FR/FAQ/Base/121
je vois des instructions SQL quel environnement faut-il ?

Vu que c'est dans le wiki Base, ça doit être du HSQL.

si j'édite en SQL ma requête de calcul des âges puis-je la modifier pour obtenir un champ age qui soit défini par le résulta de DATEDIFF (....

Ça dépend si tu veux afficher ton résultat dans un formulaire par exemple ou le stocker dans les enregistrements de ta table (auquel cas on en revient au problème de l'UPDATE).

Bernard

Bonjour

fricard Claude wrote

Lorsque dans ce wiki:
https://wiki.documentfoundation.org/FR/FAQ/Base/121
je vois des instructions SQL quel environnement faut-il ?

Quand rien n'est précisé c'est que les instructions données sont prévues
pour le moteur par défaut inclus dans LibreOffice, HSQL en l'occurrence.

fricard Claude wrote

si j'édite en SQL ma requête de calcul des âges puis-je la modifier pour
obtenir un champ age qui soit défini par le résulta de DATEDIFF (....
Les instructions actuellement dans ma requête:
SELECT DATEDIFF( 'year', "date de naissance", NOW( ) ) AS "age",...

Je dirais qu'il suffit de faire le test... :slight_smile:
Mais on se rend compte alors que DATEDIFF ne fait ici qu'un calcul sur
l'année sans tenir compte de la date et que le résultat sera incorrect.

Exemple appliqué à la base fournie avec la FAQ :
<http://nabble.documentfoundation.org/file/n4034400/CalcAge.png>

Exécutée le 4/2/13 les derniers enregistrements devraient être 55, 5, 5, 55,
etc.

La FAQ donne des exemples fonctionnels, pourquoi ne pas les utiliser ?

Sur l'enregistrement dans une table il est exact que les requêtes UPDATE ne
peuvent
être exécutées (hors macro) que via Outis> SQL.

Cela dit les "formes normales " d'une base excluent de stocker un résultat
pouvant
être recalculé. Un âge change au jour le jour et peut être recalculé par
rapport
à n'importe quelle date de référence.

De plus, je ne comprends pas l'argument de stocker pour s'en servir comme
source
de formulaire, rapport, requête car tous ces objets peuvent utiliser une
requête
ou une vue comme source ?

Cordialement
Pierre-Yves

Merci pour ces précisions.
La requête telle que je l'ai définie DATEDIFF( 'year', "date de naissance".... donne bien le résultat escompté à savoir l'âge. (c'est d'ailleurs le code dans l'exemple fourni calcâge.png) . Comment l'écrire pour un résultat plus juste avec la date complète aa,mm,jj (ou l'inverse) ?
Il est vrai que l'alias "age" convient pour une utilisation ponctuelle, et n'a donc pas à être stocké. Dont acte.
A+

Claude

Bonjour

fricard Claude wrote

La requête telle que je l'ai définie DATEDIFF( 'year', "date de
naissance".... donne bien le résultat escompté à savoir l'âge. (c'est
d'ailleurs le code dans l'exemple fourni calcâge.png) .

Il me semble qu'une personne née le 14/03/2007 n'aura 6 ans que...
le 14/03/07 ?

Or DATEDIFF telle que tu l'emploies (et c'est pour illustrer cela
que j'ai repris cette syntaxe dans la copie d'écran) donne 6 et non 5

fricard Claude wrote

Comment l'écrire pour un résultat plus juste avec la date complète
aa,mm,jj (ou l'inverse) ?

Je ne comprends pas la question : la FAQ donne un exemple de calcul
précis jour mois année.

Si la question est comment "réunir" dans un seul champ c'est de la
manipulation de chaîne. Par exemple, en gardant les champs séparés
(au cas où) on peut partir de la requête "Années Mois Jours" de la FAQ
et faire :

<http://nabble.documentfoundation.org/file/n4034483/DetailAge.png>

L'opérateur de concaténation est ||
On inclut un sépateur (ici virgule espace). C'est une chaîne donc on la note
entre quotes (simples) vs les noms de champs (entre guillemets).

Cordialement
Pierre-Yves

Claude

Bonjour

fricard Claude wrote

La requête telle que je l'ai définie DATEDIFF( 'year', "date de
naissance".... donne bien le résultat escompté à savoir l'âge. (c'est
d'ailleurs le code dans l'exemple fourni calcâge.png) .

Il me semble qu'une personne née le 14/03/2007 n'aura 6 ans que...
le 14/03/07 ?

Or DATEDIFF telle que tu l'emploies (et c'est pour illustrer cela
que j'ai repris cette syntaxe dans la copie d'écran) donne 6 et non 5

c'est ce qui résulte aussi de l'exécution de l'exemple que tu as transmis :
http://nabble.documentfoundation.org/file/n4034400/CalcAge.png
le gamin qui est de mars 2007 a déjà 6 ans ...et même celui qui est d'Aout. C'est le résultat que j'obtiens également. Quant à la copie d'écran

FAQ/Base/121
  si cela a été fait en 2011 si on trouve 4ans ça me semble normal...

fricard Claude wrote

Comment l'écrire pour un résultat plus juste avec la date complète
aa,mm,jj (ou l'inverse) ?

Je ne comprends pas la question : la FAQ donne un exemple de calcul
précis jour mois année.

Si la question est comment "réunir" dans un seul champ c'est de la
manipulation de chaîne. Par exemple, en gardant les champs séparés
(au cas où) on peut partir de la requête "Années Mois Jours" de la FAQ
et faire :

Ma question était plutôt de trouver une méthode pour que quelqu'un qui soit né avant juillet soit considéré comme n'ayant pas encore 6 ans (notre exemple) et qu'après il est déjà 6 ans. D'où le terme il est dans sa 68ème année

<http://nabble.documentfoundation.org/file/n4034483/DetailAge.png>

L'opérateur de concaténation est ||
On inclut un sépateur (ici virgule espace). C'est une chaîne donc on la note
entre quotes (simples) vs les noms de champs (entre guillemets).

Merci pour cette information. Cependant si cela m'est utile à titre personnel, ainsi que je l'ai expliqué je ne veux pas avec mes "élèves" (des retraités...) avoir recours au SQL.
En tout cas merci à toi ainsi qu'à Bernard

Suite...

Nous avons, semble-t-il, du mal à nous comprendre.

fricard Claude wrote

le gamin qui est de mars 2007 a déjà 6 ans ...et même celui qui est
d'Aout. C'est le résultat que j'obtiens également.

Tu es donc d'accord que la requête telle que tu l'avais définie
précédemment ne donne *pas* le résultat escompté.

Or dans ton message précédent :

fricard Claude wrote

La requête telle que je l'ai définie DATEDIFF( 'year', "date de
naissance".... donne bien le résultat escompté à savoir l'âge.

fricard Claude wrote

Quant à la copie d'écran FAQ/Base/121
  si cela a été fait en 2011 si on trouve 4ans ça me semble normal...

Les requêtes de cette FAQ *permettent* d'obtenir le résutlat
escompté, ce que j'indique depuis le début :slight_smile:

fricard Claude wrote

Ma question était plutôt de trouver une méthode pour que quelqu'un qui
soit né avant juillet soit considéré comme n'ayant pas encore 6 ans
(notre exemple) et qu'après il est déjà 6 ans. D'où le terme il est dans
sa 68ème année

Cf. ci-dessus la FAQ donne cette méthode.

Cordialement
Pierre-Yves

Bonjour,

J'ai un souci avec la requête, tant sous LibO 4.0.0.3 sous XP que sous Ubuntu 12.04 avec 3.5.7 de LibO :

Dans les deux cas la requête fonctionne avec la base exemple fournie par PYS, mais la même requête provoque des erreurs SQL avec des bases neuves, créées avec les deux versions de LibreOffice installée avec le SGBD par défaut. Le message est "Syntax error in SQL expression". Le détail est toujours le même et guère explicite.

Il semble que beaucoup de fonctions produisent des erreurs. J'ai seulement réussi à faire fonctionner la requête suivante :

SELECT "Nom", "Prenom", "DateNaissance", CASEWHEN( MONTH( CURRENT_DATE ) < MONTH( "DateNaissance" ), YEAR( CURRENT_DATE ) - YEAR( "DateNaissance" ) - 1, YEAR( CURRENT_DATE ) - YEAR( "DateNaissance" ) ) AS "Age" FROM "Individus"

Si j'utilise la syntaxe de CASEWHEN avec THEN, ELSE, END, il y a erreur. Si j'ajoute un OR ou un AND, la même erreur. Si j'ajoute un CAST il y a aussi erreur, toujours la même. J'ai travaillé en tentant de retirer dans la requête qui ne fonctionne pas et en ajoutant dans celle qui fonctionne, mais je n'ai pas réussi à voir où se trouve le piège. Rien de trouvé de clair sur Internet.

Comme de plus cela dépend de la base et non de la version du logiciel...

Y aurait-il un paramétrage des bases permettant d'exécuter plus de fonctions du moteur HSQL ?

Idée sur le piège ?

Merci de votre aide.

Cordialement.

Jean-Yves ROYER

-----Message d'origine-----
De : pierre-yves samyn [mailto:pierre-yves.samyn@laposte.net]
Envoyé : mardi 5 février 2013 14:45
À : users@fr.libreoffice.org
Objet : [fr-users] Re: LibO 3.5 SouS XP Base requête calcul age-

Suite...

Nous avons, semble-t-il, du mal à nous comprendre.

fricard Claude wrote
> le gamin qui est de mars 2007 a déjà 6 ans ...et même celui qui est
> d'Aout. C'est le résultat que j'obtiens également.

Tu es donc d'accord que la requête telle que tu l'avais définie
précédemment ne donne *pas* le résultat escompté.

Or dans ton message précédent :

fricard Claude wrote
> La requête telle que je l'ai définie DATEDIFF( 'year', "date de
> naissance".... donne bien le résultat escompté à savoir l'âge.

fricard Claude wrote
> Quant à la copie d'écran FAQ/Base/121
> si cela a été fait en 2011 si on trouve 4ans ça me semble normal...

Les requêtes de cette FAQ *permettent* d'obtenir le résutlat
escompté, ce que j'indique depuis le début :slight_smile:

fricard Claude wrote
> Ma question était plutôt de trouver une méthode pour que quelqu'un qui
> soit né avant juillet soit considéré comme n'ayant pas encore 6 ans
> (notre exemple) et qu'après il est déjà 6 ans. D'où le terme il est dans
> sa 68ème année

Cf. ci-dessus la FAQ donne cette méthode.

Cordialement
Pierre-Yves

--
View this message in context:
http://nabble.documentfoundation.org/LibO-3-5-SouS-XP-Base-requete-cal

cul-age-tp4034280p4034573.html

Je profite de cette intervention de Jean-Yves, et je l'en remercie, pour "pomper" la requête qu'il propose de calcul l'age au plus juste.
Je l'ai adaptée à ma base et ça fonctionne.
le problème de CAST...:wink: m'échappe un peu...

Claude

Bonjour Jean-Yves

royerjy wrote

Idée sur le piège ?

En effet certaines fonctions nécessitent de valider le mode d'exécution
directe du SQL. En l'occurrence, pour la requête "simple" (sans le détail
des jours et mois) c'est la fonction CAST.

J'ai complété la FAQ avec cette précision.

Cordialement
Pierre-Yves

-----Message d'origine-----
De : pierre-yves samyn [mailto:pierre-yves.samyn@laposte.net]
Envoyé : mercredi 6 février 2013 14:30
À : users@fr.libreoffice.org
Objet : [fr-users] Re: LibO 3.5 SouS XP Base requête calcul age-

Bonjour Pierre-Yves,

Merci beaucoup,

En effet certaines fonctions nécessitent de valider le mode d'exécution
directe du SQL. En l'occurrence, pour la requête "simple" (sans le détail
des jours et mois) c'est la fonction CAST.

J'ai complété la FAQ avec cette précision.

Le détail qui change tout...

Notamment, Claude va pouvoir calculer l'âge exact. J'en ai aussi besoin.

Heureusement que tu es là. MERCI BEAUCOUP !

Cordialement.

Jean-Yves ROYER

Bonjour,

Désolé d'intervenir dans ce fil, mais je pense que certains d'entre vous font fausse route dans les calculs d'ages. Avec Calc ça avait fait l'objet de longues discussions. Je ne connais pas suffisamment Base pour dire ce qu'il faut faire, mais je peux donner les indications avec le tableur. Il suffit (!) d'adapter à la suite.
Bien que le site soit inactif, les infos sont toujours valables:
http://christianwtd.free.fr/index.php?rubrique=DebFonctions02
dans la rubrique : Attention au piège (2), j'écrivais :
Le calcul d'âge (année, mois, jour) est une source fréquente d'erreur. On a tendance à soustraire la date actuelle à la date de naissance, puis si nécessaire d'afficher au format Jour / Mois / Année. Cette méthode n'est que très approximative et fausse. Démonstration. Une personne est née le 25 janvier 1930 (soit la valeur numérique 10983). Si nous sommes le 15 septembre 2010 (soit la valeur numérique 40436). Avec une simple soustraction, nous obtenons 80 ans 8 mois et 20 jours. En fait nous appliquons une valeur numérique (résultat de soustraction), 29453 dans ce cas précis, qui correspond à la date du 20/08/1980.

En espérant aider un peu,
Bon surf,
Christian

Bonjour Christian

christianwtd wrote

On a tendance à soustraire la date actuelle à la date de naissance, puis
si nécessaire d'afficher au format Jour / Mois / Année. Cette méthode
n'est que très approximative et fausse. Démonstration. Une personne est
née le 25 janvier 1930 (soit la valeur numérique 10983). Si nous sommes
le 15 septembre 2010 (soit la valeur numérique 40436). Avec une simple
soustraction, nous obtenons 80 ans 8 mois et 20 jours. En fait nous
appliquons une valeur numérique (résultat de soustraction), 29453 dans
ce cas précis, qui correspond à la date du 20/08/1980.

+1

Les requêtes données dans la FAQ Base donne bien 83 ans 0 mois et 13 jours
si nous
calculons aujourd'hui (7/2/13).

En complément je rappelle que Calc dispose désormais de la fonction
DATEDIF
83=DATEDIF(A1;A4;"y")
0=DATEDIF(A1;A4;"ym")
13=DATEDIF(A1;A4;"md")

Se reporter à l'aide de la fonction pour les paramètres.

Cordialement
Pierre-Yves

Bonjour,
Juste pour info, dans une base de données avec ACCESS je calcul les âges des adhérents dans une requête Mise à jour avec cette formule: (Date()-[TABLE TOUTES INFOS ELEVES]![Date naissance])/"365,25"
Ce n'est pas très loin de l'âge réel....:wink:
Avec cette question j'aurai appris des choses et c'est bien là l'intérêt...

Claude Fricard

Je ne suis pas certain d'avoir tout suivi, mais qu'est-ce qui empêche (pour obtenir l'âge de quelqu'un) d'avoir recours à une fonction mathématique sur le nombre de jours écoulés depuis sa naissance ?

La fonction DATEDIFF donne (par défaut) un nombre de jours.

Une année, c'est 365,25 jours (à une vache près).

Normalement, si on divise le nombre de jours donné par DATEDIFF 365,25 et qu'on ne retient que le le nombre entier, on devrait trouver le résultat exact dans un nombre de cas assez important ; or, ça tombe bien, il y a une fonction qui réalise la division entière, c'est DIV ; elle s'écrit "11 DIV 2" et donnera ici un résultat de 5.

Ça donnerait donc la formule suivante : "SELECT (DATEDIFF(Now(), Naissance) DIV 365.25) from..."

A priori, je pensais que ça poserait problème sur des situation particulières (genre à la veille de l'anniversaire de la personne, ou le jour même, ou bien encore lorsque la personne est née avant le 28/02/2000) et ça n'a pas l'air d'en poser sur les quelques essais que j'ai pu faire.

A+