Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
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 23/01/2011, 22h09   #1
Invité de passage
 
Inscription : juin 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 4
Points : 2
Points : 2
Par défaut calcul d'une moyenne d'âge

Bonjour,

j'essaie de calculer la moyenne d'age de toutes les personnes d'une table, à une date antérieure ( le 1er janvier 2000) dans la requête suivante :

Code :
1
2
SELECT AVG(TO_CHAR(TO_DATE('01-01-2000', 'FXDD-FXMM-YYYY'))-(TO_CHAR(pers_datenaiss, 'DD-MM-RR')))
FROM PERS;
et j'obtiens l'erreur :
Citation:
ORA-01722: Nombre non valide
je suppose que c'est la partie du début : TO_CHAR(TO_DATE('01-01-2000', 'FXDD-FXMM-YYYY')) qui pose problème, car j'ai essayé de l'afficher seul et ca n'affiche que les 2 derniers '00' de 2000...

je ne sais pas si je suis assez clair

si quelqu’un voit la solution ? (ca fait 2-3 j. que je cherche, et ai même tenté en modifiant NLS_DATE_FORMAT)
nash1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 08h46   #2
Membre régulier
 
Inscription : septembre 2008
Messages : 84
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 84
Points : 88
Points : 88
Bonjour, je pense plutot que c est le Avg(to_char(...)) qui pose probleme.

Essaie plutot ceci :
Code :
1
2
3
4
WITH Matable AS (SELECT '01-01-1989' Naissance FROM dual
Union ALL SELECT '01-01-1979' Naissance FROM dual)
SELECT Avg(MONTHS_BETWEEN(TO_DATE('01-01-2000', 'dd-mm-yyyy'), TO_DATE(NAISSANCE, 'dd-mm-yyyy')) / 12) A
  FROM MATABLE
spdev666 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 13h45   #3
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
Salut,
tu peux essayer ceci :
Code :
1
2
3
SELECT 
       avg(floor(months_between(TO_DATE('01-01-2000', 'dd-mm-yyyy'), DateNaissance) /12)) 
FROM maTableDePersonnes ;
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 14h54   #4
Invité de passage
 
Inscription : juin 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 4
Points : 2
Points : 2
Citation:
Envoyé par nash1 Voir le message

je suppose que c'est la partie du début : TO_CHAR(TO_DATE('01-01-2000', 'FXDD-FXMM-YYYY')) qui pose problème, car j'ai essayé de l'afficher seul et ca n'affiche que les 2 derniers '00' de 2000...
précision
en fait j'arrive avec seulement
Code :
AVG(2000 - (datenaissance))
mais j'aimerais avoir la précision au nb. de jours...
nash1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 15h33   #5
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Au nombre de jours, c'est le plus simple car c'est la précision de la soustraction d'une date par une autre.

En limitant aux personnes nées avant l'an 2000 :
Code :
1
2
3
SELECT avg(date '2000-01-01' - pers_datenaiss) AS moyenne_age
  FROM PERS
 WHERE pers_datenaiss < date '2000-01-01';
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 15h33   #6
Invité de passage
 
Inscription : juin 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 4
Points : 2
Points : 2
Citation:
Envoyé par Yorglaa Voir le message
Salut,
tu peux essayer ceci :
Code :
1
2
3
SELECT 
       avg(floor(months_between(TO_DATE('01-01-2000', 'dd-mm-yyyy'), DateNaissance) /12)) 
FROM maTableDePersonnes ;
Oui ca passe bien même en testant la précision au nbre de jours (naissance le 31 decembre ou 2 janvier...)! Merci beaucoup
nash1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 18h19   #7
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
Mais pas de soucis
un p'tit "Résolu" alors ?
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa 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 04h01.


 
 
 
 
Partenaires

Hébergement Web