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

 Oracle Discussion :

Age en fonction d'une date de naissance et intervalle d'âge


Sujet :

Oracle

  1. #1
    Membre habitué Avatar de rsuinux
    Homme Profil pro
    Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Inscrit en
    Août 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Secteur : Santé

    Informations forums :
    Inscription : Août 2007
    Messages : 134
    Points : 174
    Points
    174
    Par défaut Age en fonction d'une date de naissance et intervalle d'âge
    Bonjour,
    J'ai un problème avec oracle (en fait, je pense que c'est avec les fonction de date, bien que je commence à m'en sortir un peu de ce côté)
    J'ai une requête ou il me faut l'âge de selon la date entrée en base, et comme critère de trie, un intervalle d'âge.
    J'ai déjà pas mal progressé sur d'autre critère, reste ces deux là. Voila ou j'en suis:
    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 
           to_char(sysdate, 'YYYYMMDD') " date",  - formatage pour être identique au format de la colonne p.dtnaissance
           p.dtnais "date naissance"
     
    from icsf.patient p, icsf.pres_obj po, icsf.t_soins_actions sa, icsf.umheb um,  icsf.t_evt_rdv er 
     
     
    where po.nopat = p.nopat
          and er.noevt = po.noevt
          and po.typevt = 'R'
          and um.codeumheb in ('3600', '3635' )
          and er.noumheb = um.noumheb
          and sa.opres_id = po.opres_id
          and po.nocategoriefiltre = 7
          and er.timestamp > to_date('10-06-2024', 'dd-mm-yyyy')
          and er.timestamp < to_date('12-06-2024', 'dd-mm-yyyy')
    Voila le tableau en sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
             date         date naissance
    1    20240624    20070523
    2    20240624    20070523
    3    20240624    20070523
    4    20240624    20070523
    5    20240624    20150521
    6    20240624    20150521
    7    20240624    20161008
    8    20240624    20120928
    9    20240624    20120928
    10    20240624    20120928

    Ce que je n'arrive pas à faire, c'est calculer l'âge déjà.
    ensuite, dans mes critère de trie, il me faut ne garder que ceux entre 7 et 12 ans. Et là j'avoue que je sèche complètement.
    Si vous avez une piste, je vous remercie beaucoup.

    Rémi.
    Si tu ne sais pas: demande, si tu sais, partage.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 949
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 949
    Points : 4 372
    Points
    4 372
    Par défaut
    Avec ORACLE, soustraire une date à une autre donne une différence (nombre décimal) en jours... à partir de là à vous de définir votre notion d'âge dans votre contexte.
    Vous pouvez aussi jouter avec la fonction EXTRACT et faire la différence des années, et éventuellement soustraire 1 si le jour de SYSDATE est avant celui de la date de naissance.

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 149
    Points : 1 930
    Points
    1 930
    Par défaut
    Bonjour,

    En gros tu fais un months_between et tu divises par 12.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    months_between(sysdate, dtnais) / 12

  4. #4
    Membre habitué Avatar de rsuinux
    Homme Profil pro
    Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Inscrit en
    Août 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Secteur : Santé

    Informations forums :
    Inscription : Août 2007
    Messages : 134
    Points : 174
    Points
    174
    Par défaut
    @vanagreg
    ok, pour l'age j'ai été obligé d'arrondir, mais c'est bon, merci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    round(MONTHS_BETWEEN (SYSDATE , to_date(p.dtnais,'YYYYMMDD'))/12, 0 ) "Age",
    


    Après pour filtrer entre 7 et 12 ans, j'ai tenté ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    where (sysdate - to_date(p.dtnais,'YYYYMMDD')) BETWEEN  '7'  AND '12'
           and po.nopat = p.nopat
          and er.noevt = po.noevt
    et le reste idem

    Mais rien ne remonte. Aucune erreur, mais aucun résultat. J'ai oublié quelque chose, n'est-ce pas?
    Si tu ne sais pas: demande, si tu sais, partage.

  5. #5
    Membre habitué Avatar de rsuinux
    Homme Profil pro
    Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Inscrit en
    Août 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Secteur : Santé

    Informations forums :
    Inscription : Août 2007
    Messages : 134
    Points : 174
    Points
    174
    Par défaut
    J'ai testé mes dates, pour voir.
    Comme je voulais faire un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where (to_date(sysdate,'DD/MM/YY') - to_date(p.dtnais,'YYYYMMDD')) BETWEEN  '7'  AND '12'
    Qui ne remonte rien.
    Suspectant un problème de formatage dedate, j'ai voulu vérifier. Dans mon select, j'ai mis mes instructions à l'identique, pour voir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    (to_date(sysdate,'DD/MM/YY')) "date du jour",
    (to_date(p.dtnais,'YYYYMMDD')) "date de naiss",
    (to_date(sysdate,'DD/MM/YY') - to_date(p.dtnais,'YYYYMMDD')) "ecart",
    Et j'ai un résultat pour le moins étrangequelques exemples)
    Age Validation labo date du jour date de naiss ecart
    1 Emis 25/06/2024 25/05/2023 397
    1 Emis 25/06/2024 25/05/2023 397
    16 Emis 25/06/2024 24/05/2008 5876
    16 Emis 25/06/2024 24/05/2008 5876
    1 Emis 25/06/2024 26/02/2023 485
    15 Emis 25/06/2024 09/12/2009 5312


    Pourquoi la colonne ecrat me donne ces valeurs?
    Si tu ne sais pas: demande, si tu sais, partage.

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 149
    Points : 1 930
    Points
    1 930
    Par défaut
    Pour le filtre il faut utiliser la même chose que pour le calcul :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE round(MONTHS_BETWEEN (SYSDATE , to_date(p.dtnais,'YYYYMMDD'))/12) between 7 and 12
    Par contre, la colonne DTNAIS n'est pas de type DATE ?? Quel est l'hérétique qui a déclaré une colonne devant contenir des dates en caractères?

    Je vois aussi que tu écris ça:

    to_date(sysdate,'DD/MM/YY')

    SYSDATE est déjà une date, donc en faisant un TO_DATE sur SYSDATE, Oracle fait une conversion implicite en caractères pour la reconvertir en date. A proscrire.

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 097
    Points : 28 395
    Points
    28 395
    Par défaut
    Bonjour,

    L'expression (sysdate - to_date(p.dtnais,'YYYYMMDD')) renvoie un nombre de jours entre ces deux dates, pas un nombre d'années. Donc à moins de se concentrer sur les nourrissons (et que ceux-ci soient bien enregistrés dans la base ), c'est un peu normal que la requête ne retourne aucune ligne.

    Au passage je relève deux problèmes de typage :
    • to_date(p.dtnais,'YYYYMMDD')) :
      Cela signifierait que les dates de naissances sont stockées sous forme de chaine de caractère ?
      C'est bien dommage alors que le type DATE existe et, entre autres avantages, évite l'enregistrement de dates invalides.
      Ici une conversion est donc nécessaire pour tous les calculs sur des dates, ce quine va pas dans le sens de l'optimisation des temps de réponse.
    • (sysdate - to_date(p.dtnais,'YYYYMMDD')) BETWEEN '7' AND '12' :
      Pourquoi comparer un nombre avec des chaines de caractères ?
      D'autant plus que '7' est supérieur à '12' donc l'expression xxx BETWEEN '7' AND '12' est potentiellement toujours fausse si le SGBD effectue la conversion du nombre xxx en chaine pour effectuer la comparaison.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  8. #8
    Membre habitué Avatar de rsuinux
    Homme Profil pro
    Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Inscrit en
    Août 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Secteur : Santé

    Informations forums :
    Inscription : Août 2007
    Messages : 134
    Points : 174
    Points
    174
    Par défaut
    Je suis d'accord avec toi, les dates en format texte, c'est pas top, mais je n'ai pas la main. La base est 'âgée' et il y a plus de 2 millions d'enregistrements.
    Pour ta seconde constatation, je n'avais pas vu ça comme ça, mais c'est une bonne remarque.
    Si tu ne sais pas: demande, si tu sais, partage.

  9. #9
    Membre habitué Avatar de rsuinux
    Homme Profil pro
    Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Inscrit en
    Août 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Secteur : Santé

    Informations forums :
    Inscription : Août 2007
    Messages : 134
    Points : 174
    Points
    174
    Par défaut
    C'est effectivement mieux en divisant par 365
    Merci
    fin de discussion.
    Si tu ne sais pas: demande, si tu sais, partage.

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

Discussions similaires

  1. Requête tranche d'âge en fonction de la date de naissance
    Par Devilju69 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/01/2014, 13h16
  2. [XL-2002] Formules d'âge en fonction d'une date
    Par DrBlob dans le forum Excel
    Réponses: 5
    Dernier message: 12/08/2009, 19h30
  3. Réponses: 8
    Dernier message: 27/02/2009, 04h06
  4. Age à partir d'une date de naissance
    Par NABIL74 dans le forum Bases de données
    Réponses: 6
    Dernier message: 29/01/2009, 12h43
  5. [MySQL] Calculer l'âge en fonction de la date de naissance
    Par loic20h28 dans le forum PHP & Base de données
    Réponses: 49
    Dernier message: 16/10/2008, 13h49

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