Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
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 09/12/2011, 21h08   #1
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 155
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 155
Points : 35
Points : 35
Par défaut 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
AgriPhilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2011, 23h13   #2
Membre Expert
 
Avatar de nico84
 
Homme Nicolas Guimbal
Consultant/développeur ERP
Inscription : mai 2008
Messages : 1 258
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Guimbal
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant/développeur ERP
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2008
Messages : 1 258
Points : 1 877
Points : 1 877
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 :
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
nico84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2011, 23h15   #3
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 155
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 155
Points : 35
Points : 35
Merci quand même et bonne soirée.

@+
AgriPhilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2011, 09h57   #4
Membre éprouvé
 
Homme Robert LINCE
Conseiller psycho-pédagogique
Inscription : octobre 2007
Messages : 281
Détails du profil
Informations personnelles :
Nom : Homme Robert LINCE
Localisation : Belgique

Informations professionnelles :
Activité : Conseiller psycho-pédagogique
Secteur : Enseignement

Informations forums :
Inscription : octobre 2007
Messages : 281
Points : 483
Points : 483
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 :
=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
RobiPMS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2011, 10h07   #5
Membre éprouvé
 
Homme Robert LINCE
Conseiller psycho-pédagogique
Inscription : octobre 2007
Messages : 281
Détails du profil
Informations personnelles :
Nom : Homme Robert LINCE
Localisation : Belgique

Informations professionnelles :
Activité : Conseiller psycho-pédagogique
Secteur : Enseignement

Informations forums :
Inscription : octobre 2007
Messages : 281
Points : 483
Points : 483
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
RobiPMS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2011, 14h39   #6
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 155
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 155
Points : 35
Points : 35
Merci pour les réponses je vais faire des essais.

@+
AgriPhilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2011, 15h46   #7
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 155
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 155
Points : 35
Points : 35
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.
AgriPhilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2011, 16h20   #8
Rédacteur/Modérateur
 
Avatar de Domi2
 
Homme
Inscription : juin 2006
Messages : 6 225
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 52
Localisation : Suisse

Informations professionnelles :
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juin 2006
Messages : 6 225
Points : 9 928
Points : 9 928
Envoyer un message via Skype™ à Domi2
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
Domi2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2011, 14h49   #9
Membre éprouvé
 
Homme Robert LINCE
Conseiller psycho-pédagogique
Inscription : octobre 2007
Messages : 281
Détails du profil
Informations personnelles :
Nom : Homme Robert LINCE
Localisation : Belgique

Informations professionnelles :
Activité : Conseiller psycho-pédagogique
Secteur : Enseignement

Informations forums :
Inscription : octobre 2007
Messages : 281
Points : 483
Points : 483
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
RobiPMS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 23h07   #10
Membre éprouvé
 
Homme Robert LINCE
Conseiller psycho-pédagogique
Inscription : octobre 2007
Messages : 281
Détails du profil
Informations personnelles :
Nom : Homme Robert LINCE
Localisation : Belgique

Informations professionnelles :
Activité : Conseiller psycho-pédagogique
Secteur : Enseignement

Informations forums :
Inscription : octobre 2007
Messages : 281
Points : 483
Points : 483
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 :
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 :
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.
RobiPMS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 23h12   #11
Membre Expert
 
Avatar de nico84
 
Homme Nicolas Guimbal
Consultant/développeur ERP
Inscription : mai 2008
Messages : 1 258
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Guimbal
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant/développeur ERP
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2008
Messages : 1 258
Points : 1 877
Points : 1 877
Je ne sais pas si c'est juste mais c'est encore bien plus compliqué que ce que je propose plus haut
nico84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2011, 09h11   #12
Membre éprouvé
 
Homme Robert LINCE
Conseiller psycho-pédagogique
Inscription : octobre 2007
Messages : 281
Détails du profil
Informations personnelles :
Nom : Homme Robert LINCE
Localisation : Belgique

Informations professionnelles :
Activité : Conseiller psycho-pédagogique
Secteur : Enseignement

Informations forums :
Inscription : octobre 2007
Messages : 281
Points : 483
Points : 483
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.
RobiPMS est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h24.


 
 
 
 
Partenaires

Hébergement Web