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

Requêtes et SQL. Discussion :

DiffDate pour calculer l'âge en mois jours


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    DiffDate pour calculer l'âge en mois jours
    Bonsoir,

    Je recherche une solution pour calculer l'âge avec DIFFDATE() sous le format

    Mois jours, ou mois seul mais avec précision.

    Pourriez-vous m'aider ?

    Par exemple aujourd'hui :09/12/2011 naissance le 01/10/2009
    = 26 mois et 8 jours

    Dans Excel c'est très simple

    Merci d'avance

  2. #2
    Expert confirmé
    Je me souviens d'avoir vu ça il y a qq années dans la FAQ je crois...
    Pour un format jour/mois/an (date1<=date2) :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    'années : 
    year(date2)-year(date1)+iif(format(date2,'mmdd')<format(date1,'mmdd'),-1,0)
    'mois :
    iif(format(date2,'mmdd')<format(date1,'mmdd'),month(date2)-month(date1)+12, month(date2)-month(date1))+iif(day(date2)<day(date1),-1,0)
    'jours :  
    iif(day(date2)<=day(date1), day(date2)-day(date1)+day(date2-day(date2)-1), day(date2)-day(date1))


    J'ai pas plus simple
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  3. #3
    Membre régulier
    Merci quand même et bonne soirée.

    @+

  4. #4
    Membre expérimenté
    Bonjour.

    Voici la formule que j'utilise pour afficher l'âge en années mois, dans un champ calculé à partir de deux champs "Date/nais" et "Date examen" :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    =Int(-([Date/nais]-[Date examen])/365,25) & " ans " & Int(12*((-([Date/nais]-[Date examen])/365,25)-Int(-([Date/nais]-[Date examen])/365,25))) & " mois"


    Je l'utilise sans souci depuis plusieurs années dans toutes les versions d'access depuis 2000. La division par 365,25 permet de tenir compte des années bisextiles.
    A adapter pour avoir en plus les jours.
    Cordialement.

    RL
    N'oubliez pas de tagguer la discussion comme résolue si vous avez été aidé!
    Plus haut monte le singe, plus il montre son cul (Montaigne)
    Je ne réponds pas aux messages personnels concernant des questions discutées dans le forum.

  5. #5
    Membre expérimenté
    Rebonjour.

    Si tu as un problème pour l'adapter à tes besoins (mois et jours plutôt que années mois) je veux bien fouiller dans mes archives et réécrire le code.
    Dans ce cas, demande...

    Cordialement
    N'oubliez pas de tagguer la discussion comme résolue si vous avez été aidé!
    Plus haut monte le singe, plus il montre son cul (Montaigne)
    Je ne réponds pas aux messages personnels concernant des questions discutées dans le forum.

  6. #6
    Membre régulier
    Merci pour les réponses je vais faire des essais.

    @+

  7. #7
    Membre régulier
    RobiPMS,

    Si tu connais la formule pour obtenir le résultat uniquement en mois et jour je suis preneur.
    sous le format 00 mois et 00 jours

    Merci d'avance.

  8. #8
    Expert éminent sénior
    Bonjour,

    Déjà, pour calculer juste (à oublier la division par 365.25).

    Domi2
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  9. #9
    Membre expérimenté
    Bonjour Domi2 et bonjour à tous.

    Merci pour la remarque. J’ai lu attentivement la discussion que tu cites, et j’ai essayé les codes proposés. OK, ils retournent un nombre correct d’années entièrement écoulées depuis la date de naissance. Mais on n’a ni les mois, ni les jours, ce qui simplifie beaucoup le problème.
    Si on veut avoir les mois en plus, ça se complique : je suis en train d’essayer d’adapter le code pour arriver à une formule qui affiche un bon résultat dans tous les cas.
    Si quelqu’un a la solution, ne me laissez pas chercher !
    Ça se complique encore pour les jours puisqu’il faut alors tenir compte des mois de 28, 29, 30 ou 31 jours.
    Ma formule initiale n’est certes pas « juste » : c’est effectivement une approximation qui affiche un résultat incorrect le jour de l’anniversaire de la personne une fois tous les 4 ans (à cause de la fonction Int qui supprime la partie fractionnelle). Il faudrait peut-être essayer une formule avec Round ?
    Le résultat affiché est donc correct 1460 fois sur 1461. Si on « oublie » le partage par 365,25 on aura bien entendu avec une telle formule une erreur de plus en plus importante en fonction de l’âge réel de l’individu. Est-ce que je me trompe ?
    Le seul résultat qui sera incontestablement toujours « juste », et à utiliser si on veut en faire un usage scientifique, c’est l’âge en jours.
    Moi, je ne parlerais pas d’un résultat juste pour un âge exprimé en années, ou en années + mois, mais seulement d’un affichage correct : un âge exprimé partiellement ne peut pas être juste, par définition.
    Je reposte si je trouve mieux.

    Cordialement
    N'oubliez pas de tagguer la discussion comme résolue si vous avez été aidé!
    Plus haut monte le singe, plus il montre son cul (Montaigne)
    Je ne réponds pas aux messages personnels concernant des questions discutées dans le forum.

  10. #10
    Membre expérimenté
    Bonjour.
    Une proposition de plus, qui retourne un résultat en années mois jours, tient compte des années bissextiles et qui me semble tenir la route dans tous les cas de figure (sauf erreur de ma part ).
    Si l'un ou l'autre spécialiste du forum veut bien tester, cela me rassurerait!
    Voici le code.
    Dans un module :
    D'abord la fonction (classique) pour tester si l'année est bissextile
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Function EstBissextile(ByVal lngAnnée As Long) As Boolean
      EstBissextile = ((lngAnnée Mod 4 = 0) And (lngAnnée Mod 100 <> 0)) _
        Or (lngAnnée Mod 400 = 0)
    End Function

    Puis la fonction qui affiche l'âge en années mois jours
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Function Ageamj(dn As Date, dx As Date) As String    ' dn = date de naissance ; dx = date à laquelle on veut trouver l'âge
    Dim Y1 As Long, Y2 As Long, M1 As Long, M2 As Long, D1 As Long, D2 As Long, D3 As Long
    Y1 = Format(dn, "yyyy")
    Y2 = Format(dx, "yyyy")
    M1 = Format(dn, "m")
    M2 = Format(dx, "m")
    D1 = Format(dn, "d")
    D2 = Format(dx, "d")
    ' Calcul des jours écoulés entre le jour de la date dx (D2) et celui du mois précédent identique au jour de naissance (D1)
    If D2 >= D1 Then
    D3 = D2 - D1
    ElseIf D2 < D1 And ((M2 = 1) Or (M2 = 2) Or (M2 = 4) Or (M2 = 6) Or (M2 = 8) Or (M2 = 9) Or (M2 = 11)) Then D3 = 31 - D1 + D2
    ElseIf D2 < D1 And ((M2 = 5) Or (M2 = 7) Or (M2 = 10) Or (M2 = 12)) Then D3 = 30 - D1 + D2
    ElseIf D2 < D1 And (M2 = 3) And (EstBissextile(Y2) = True) Then D3 = 29 - D1 + D2
    ElseIf D2 < D1 And (M2 = 3) And (EstBissextile(Y2) = False) Then D3 = 28 - D1 + D2
    End If
    ' Calcul et affichage des années et mois, et des jours qui viennent d'être calculés
    If M2 = M1 And D2 = D1 Then
    Ageamj = (Y2 - Y1) & " ans"
    ElseIf M2 < M1 And D2 > D1 Or (M2 < M1 And D2 = D1) Then
    Ageamj = (Y2 - Y1 - 1) & " ans " & (12 + M2 - M1) & " mois " & D3 & " jours"
    ElseIf M2 < M1 And D2 < D1 Or (M2 = M1 And D2 < D1) Then
    Ageamj = (Y2 - Y1 - 1) & " ans " & (11 + M2 - M1) & " mois " & D3 & " jours"
    ElseIf (M2 > M1 And D2 > D1) Or (M2 > M1 And D2 = D1) Or (M2 = M1 And D2 > D1) Then
    Ageamj = (Y2 - Y1) & " ans " & (M2 - M1) & " mois " & D3 & " jours"
    ElseIf (M2 > M1 And D2 < D1) Then
    Ageamj = (Y2 - Y1) & " ans " & (M2 - M1 - 1) & " mois " & D3 & " jours"
    End If
    End Function
    J'imagine qu'il doit y avoir moyen de faire plus simple, mais je ne suis pas informaticien... Si Domi2 veut bien dire ce qu'il en pense...
    Cordialement.
    R.L.
    N'oubliez pas de tagguer la discussion comme résolue si vous avez été aidé!
    Plus haut monte le singe, plus il montre son cul (Montaigne)
    Je ne réponds pas aux messages personnels concernant des questions discutées dans le forum.

  11. #11
    Expert confirmé
    Je ne sais pas si c'est juste mais c'est encore bien plus compliqué que ce que je propose plus haut
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  12. #12
    Membre expérimenté
    Bonjour.

    C'est vrai, la fonction que propose Nico84 est beaucoup plus simple, mais elle retourne un résultat faux chaque fois que le nombre de jours de la date 2 est inférieur à celui de la date1 et que le mois qui précède la date2 comporte 30 jours ou 29 ou 28 (le nombre de jours affiché est alors inférieur à la réalité).

    Cordialement.
    N'oubliez pas de tagguer la discussion comme résolue si vous avez été aidé!
    Plus haut monte le singe, plus il montre son cul (Montaigne)
    Je ne réponds pas aux messages personnels concernant des questions discutées dans le forum.

###raw>template_hook.ano_emploi###