IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Calcul de l'age exact dans une requete


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Par défaut Calcul de l'age exact dans une requete
    Bonjour
    Je souhaite extraire l'age arrondi par defaut d'une personne en fonction de la date du jour et de sa date de naissance, voici ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select trunc((SYSDATE - date_naissance) / (365))
    from personne where nom = 'DUPONT'
    La différence entre 2 dates donnant le nbre de jours donc je divise par 365 .

    Existe t'il une fonction plus précise car ce n'est pas tout à fait juste dans la mesure où il y a des années de 366 jours.
    Merci

  2. #2
    Membre émérite Avatar de laurentibus
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Par défaut
    peut etre avec months_between
    Nombre de mois entre date1 et date2. La partie décimale est obtenue en divisant le nombre de jours par 31.
    MONTHS_BETWEEN('26-JUN-90','25-DEC-93')=40,967742 MONTHS_BETWEEN('26-JUN-90','26-DEC-89')=-6
    il ne te reste plus qu a divisé par 12 .... et toutes les années ont 12 mois

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Oui la fonction MONTHS_BETWEEN vous donnera un résultat juste même pour les années bissextiles.

    Depuis je ne sais pas quelle version, on retrouve le type de donnée INTERVAL qui est là pour couvrir pour ce genre de cas (même si je le trouve encore trop rigide au niveau des syntaxes, précisions et opérations).

    Regardez cette requête qui reprend ces divers éléments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    select
        id,    
        dt_naiss,
        floor(months_between(trunc(sysdate), dt_naiss)/12) as age_mb,
        (trunc(sysdate) - dt_naiss) YEAR(4) to MONTH as int_ym,
        extract(year from (trunc(sysdate) - dt_naiss) YEAR(4) to MONTH) as age_int
    from
    (
        select 1 id, to_date('01/01/2009', 'dd/mm/yyyy') dt_naiss from dual union all
        select 2, to_date('08/05/1945', 'dd/mm/yyyy') from dual union all
        select 3, to_date('11/11/1918', 'dd/mm/yyyy') from dual union all
        select 4, to_date('02/12/1805', 'dd/mm/yyyy') from dual union all
        select 5, to_date('14/07/1789', 'dd/mm/yyyy') from dual union all
        select 6, to_date('11/11/1111', 'dd/mm/yyyy') from dual union all
        select 7, to_date('01/01/0001', 'dd/mm/yyyy') from dual
    )
    order by id asc

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Oui la fonction MONTHS_BETWEEN vous donnera un résultat juste même pour les années bissextiles.
    c'est faux...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT
        floor(months_between(date '2010-02-28', date '1992-02-29')/12) AS age_mb
    from dual;
    18
    si tu es né un 29 février 1992, tu devras attendre le 1er mars 2010 pour atteindre tes 18 ans

    c'est pourquoi je préfère une version maison...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT
        trunc(to_char(date '2010-02-28','YYYY.MMDD')-to_char(date '1992-02-29','YYYY.MMDD')) AS age_mb
    from dual; 
    17

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Oui mais est-ce plus juste ou est-ce plus faux pour un bissexte de fêter son anniversaire le 28/02 ou le 01/03 ?

    Une rapide recherche ne fournit pas de réponse formelle, le jour de l'anniversaire étant apparement laissé au choix de l'intéressé.

    Donc je ne considère par votre soustraction, certes astucieuse, comme étant plus juste que months_between, mais c'est intéressant d'avoir une munition supplémentaire

    Celà dit ça m'a permi de voir quelque chose de troublant avec l'intervalle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select
        A,
        (A - B) YEAR to MONTH itv,
        trunc(months_between(A, B)/12) age_mb,
        extract(year from (A - B) YEAR to MONTH) as age_int,
        trunc(to_char(A,'YYYY,MMDD') - to_char(B,'YYYY,MMDD')) age_ls -- ',' est le symbole décimal sur ma base de test
    from
    (
        select to_date('01/03/2010', 'dd/mm/yyyy') A, to_date('29/02/1992', 'dd/mm/yyyy') B from dual union all
        select to_date('28/02/2010', 'dd/mm/yyyy') A, to_date('29/02/1992', 'dd/mm/yyyy') B from dual union all
        select to_date('14/02/2010', 'dd/mm/yyyy') A, to_date('29/02/1992', 'dd/mm/yyyy') B from dual union all
        select to_date('13/02/2010', 'dd/mm/yyyy') A, to_date('29/02/1992', 'dd/mm/yyyy') B from dual
    )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DATE_A		ITV	AGE_MB	AGE_INT	AGE_LS
    01/03/2010	+18-00	18	18	18
    28/02/2010	+18-00	18	18	17
    14/02/2010	+18-00	17	18	17
    13/02/2010	+17-11	17	17	17
    Il semblerait que l'intervalle s'arrondisse, 11.5 mois devenant 12 mois qui devient donc +1 an.

    Donc en fait il ne faut surtout pas l'utiliser pour calculer un âge !

  6. #6
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Waldar,
    C'est vrai que celui qui est né le 29 février fête son anniversaire quand il veut.

    Par contre si tu commets un crime le 28 février de tes 18 ans, les conséquences juridiques de ton âge auront une grande différence.

    Pour être sûr il faudrait fouiller les textes de loi.

    Bon, j'ai trouvé ça :

    http://www.mayenne.pref.gouv.fr/pdf/...list69_352.pdf
    lorsqu’il s’agit d’une personne née le 29 février, il conviendra
    d’admettre qu’elle aura atteint sa majorité le 28 février de l’année de son dix-huitième anniversaire
    Un point pour toi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. calcul différence entre deux heures dans une requete
    Par cornet04 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 18/03/2015, 16h37
  2. calcul pourcentage dans une requete imbriquée
    Par timal78 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/07/2007, 14h28
  3. Problèmes de calcul dans une requete imbriquée
    Par LeNovice dans le forum Langage SQL
    Réponses: 6
    Dernier message: 21/03/2007, 16h56
  4. colonne de calcul dans une requête
    Par Virgile59 dans le forum Access
    Réponses: 2
    Dernier message: 27/10/2006, 14h55
  5. Calculs dans une requete avec conditions multiples
    Par Sha1966 dans le forum Access
    Réponses: 3
    Dernier message: 13/01/2006, 15h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo