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 :

DateDiff en année, mois et jours [AC-2010]


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    août 2002
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2002
    Messages : 109
    Points : 78
    Points
    78
    Par défaut DateDiff en année, mois et jours
    Bonsoir,

    Je viens solliciter votre aide car je souhaite exprimer en années, mois et jours un espace-temps entre deux dates, à savoir la date du jour à laquelle je soustrais la date du dernier rendez-vous du client.

    Soit la date du précédent rendez-vous que j'ai nommée : DernierRDV
    Soit la date système : Date
    Ainsi, si le client demande combien de temps le sépare de son dernier rendez-vous par rapport à la date du jour, c'est facile de lui répondre.

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Espace-Temps: DiffDate("j";[DernierRDV];Date())+(Format(Date();"mmjj")<Format([DernierRDV];"mmjj"))
    Le code que j'ai indiqué me renvoie l'espace-temps en jours.

    Par exemple, le dernier rendez-vous du client "Dupont" remonte au 25/06/2012, ma requête ainsi libellée me renvoie "261 jours", ce qui est normal par rapport à la date d'aujourd'hui.
    Mais je souhaiterais obtenir l'espace-temps exprimée de la sorte : 0 années 8 mois 17 jours
    (ou encore 8 mois 2 semaines et 3 jours).


    Une idée me vient, puis-je concaténer les "diffdate" pour obtenir une expression en année, mois et jours ? Mais cela supposerait au préalable d'obtenir des arrondis.

    Je vous remercie d'avance pour votre aide.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : février 2010
    Messages : 801
    Points : 1 099
    Points
    1 099
    Par défaut
    Salut, colles cette fonction dans un module :
    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
    30
    31
    32
    33
    34
    35
    36
    Public Function SplitDiffDate(Date_Début As Variant, Date_Fin As Variant) As String
     
        If IsNull(Date_Début) Or IsNull(Date_Fin) Or Date_Fin < Date_Début Then
            SplitDiffDate = "#erreur"
            Exit Function
        End If
     
        Dim Ma_Date As Date, dernJour As Date, premJour As Date
        Dim nbAnnees As Integer, nbMois As Integer, nbJours As Byte
     
        'On récupère le premier jour du mois de la date de fin
        premJour = CDate("1/" & Format(Date_Fin, "mm/yyyy"))
        'On récupère le dernier jour du mois de la date de début
        dernJour = DateAdd("d", -1, CDate("1/" & Format(DateAdd("m", 1, Date_Début), "mm/yyyy")))
        ' On compte le nbre de jours entre la date de début et le dernier jour du mois de la date de début
        nbJours = DateDiff("d", Date_Début, dernJour, vbMonday, vbFirstFourDays)
        ' On ajoute le nbre de jours entre le premier jour de la date de fin et la date de fin
        nbJours = nbJours + DateDiff("d", CDate("1/" & Format(Date_Fin, "mm/yyyy")), Date_Fin, vbMonday, vbFirstFourDays) + 1
        'On compte le nbre de mois entre le premier jour du mois suivant la date de début et le premier jour du mois de la date de fin
        nbMois = DateDiff("m", dernJour + 1, premJour, vbMonday, vbFirstFourDays)
        nbAnnees = Int(nbMois / 12)
        nbMois = nbMois - (nbAnnees * 12)
     
        Do While nbJours > 30
            nbJours = nbJours - 31
            nbMois = nbMois + 1
        Loop
     
        Do While nbMois > 11
            nbMois = nbMois - 12
            nbAnnees = nbAnnees + 1
        Loop
     
        SplitDiffDate = nbAnnees & " ans " & nbMois & " mois " & nbJours & " jours "
     
    End Function
    Puis tu utilises cette requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SplitDiffDate([date1],[date2]) AS Jours FROM T_test;
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : février 2010
    Messages : 801
    Points : 1 099
    Points
    1 099
    Par défaut
    Au cas tu aurais lu ce que j'ai mis en premier, je signale que j'ai amélioré grandement cette fonction depuis mon post de ce matin
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    août 2002
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2002
    Messages : 109
    Points : 78
    Points
    78
    Par défaut
    Bonjour et merci très sincèrement de m'avoir répondu.

    Effectivement, dès ce matin , j'ai lu ce que tu as mis et j'ai commencé à travailler dessus.
    Puis j'ai effectivement constaté que tu avais amélioré grandement ta fonction.
    J'ai donc cherché à en comprendre chaque élément.
    J'ai appris et compris beaucoup. Merci.

    Je te joins la base-exemple que j'ai faîte en suivant tes conseils car je bute encore sur deux points.
    J'obtiens effectivement des espace-temps en années, mois et jours.
    Seulement, 2 problèmes subsistent encore :
    • Dans l'enregistrement 1, j'obtiens "1 an 5 mois 37 jours.
    • Dans l'enregistrement 5, j'obtiens "-1 an 11 mois 41 jours.
    Fichiers attachés Fichiers attachés

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    août 2002
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2002
    Messages : 109
    Points : 78
    Points
    78
    Par défaut
    Bonjour à tous et particulièrement à paige,

    Depuis hier, j'ai cherché de très nombreuses heures sur internet et sur des bouquins d'Access comment parvenir à affiner ta fonction.

    Je cherche à éviter les erreurs d'approximation de dates dues aux mois qui ne comprennent pas le même nombre de jours, crois-tu pouvoir m'éclairer un peu plus ?

    Je t'avoue avoir tout épuré.
    Je suis même passé sous Excel pour faire un test.
    En utilisant "diffdate" j'obtiens précisément une date en années, mois et jours, mais impossible d'adapter ma formule sous Access et je bute toujours sur l'affinage de ta fonction.

    Je te remercie du temps que tu me consacres.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : février 2010
    Messages : 801
    Points : 1 099
    Points
    1 099
    Par défaut
    Bonjour macakou99,
    Je suis en Access 97 au boulot donc je ne peux pas ouvrir ta base (il faudrait la convertir en .mdb). Quelles sont les dates qui génère le résultat "-1 an 11 mois 41 jours" et "1 an 5 mois 37 jours" ?
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mars 2004
    Messages : 91
    Points : 91
    Points
    91
    Par défaut
    Bonjour,

    Je m'incruste
    J'aurai plus opté pour une solution basé sur les modulos
    On prend le nombre de jour, on voit combien y'a d'année dedans (combien de fois on peut le diviser par 365), et on retire ces années au nombre de jour
    Puis avec ce nouveau nombre de jours, on regarde combien de fois on peut le diviser par 30 et on obtient le nombre de mois.
    On enlève les mois, le reste est le nombre de 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
    Function dateSplit(dDate1 As Date, dDate2 As Date) as String
        Dim nbJours As Long, iAnnee As Long, iMois As Long
        'Nombre de jour
        nbJours = DateDiff("d", dDate1, dDate2)
     
        'Nombre d'année
        iAnnee = (nbJours - nbJours Mod 365) / 365
     
        'Je retir les années de mes jours restant
        nbJours = nbJours - (iAnnee * 365)
     
        'Nombre de mois
        iMois = (nbJours - nbJours Mod 30) / 30
     
        'Je retir les mois de mes jours restants
        nbJours = nbJours - (iMois * 30)
     
        dateSplit = iAnnee & " an(s) " & iMois & " mois et " & nbJours & " jours"
     
    End Function
    ?dateSplit("01/01/2013", "01/01/2014")
    1 an(s) 0 mois et 0 jours

    ?dateSplit("01/01/2012", "01/01/2013")
    1 an(s) 0 mois et 1 jours

    Donc ca marche même avec les années bissextiles.

    J'édit mon poste pour ajouter les deux lignes pour les semaines :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        'Nombre de semaine
        iSemaine = (nbJours - nbJours Mod 7) / 7
        nbJours = nbJours - (iSemaine * 7)
     
        dateSplit = iAnnee & " an(s) " & iMois & " mois  " & iSemaine & " semaines et " & nbJours & " jours"
    ?dateSplit("01/02/2013", "02/03/2014")
    1 an(s) 0 mois 4 semaines et 1 jours

    ?dateSplit("01/02/2013", "01/03/2014")
    1 an(s) 0 mois 4 semaines et 0 jours

    ?dateSplit("01/02/2013", "28/02/2014")
    1 an(s) 0 mois 3 semaines et 6 jours

    Cdt
    Damran

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mars 2004
    Messages : 91
    Points : 91
    Points
    91
    Par défaut
    re moi,

    Je m'aperçois qu'il n'y a même pas besoin d'utiliser le modulo :
    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
    Function dateSplit(dDate1 As Date, dDate2 As Date)
        Dim nbJours As Long, iAnnee As Long, iMois As Long, iSemaine As Long
        'Nombre de jour
        nbJours = DateDiff("d", dDate1, dDate2)
     
        'Nombre d'année
        iAnnee = Int(nbJours / 365)
        'Je retir les années de mes jours restant
        nbJours = nbJours - (iAnnee * 365)
     
        'Nombre de mois
        iMois = Int(nbJours / 30)
        'Je retir les mois de mes jours restants
        nbJours = nbJours - (iMois * 30)
     
        'Nombre de semaine
        iSemaine = Int(nbJours / 7)
        nbJours = nbJours - (iSemaine * 7)
     
        dateSplit = iAnnee & " an(s) " & iMois & " mois  " & iSemaine & " semaines et " & nbJours & " jours"
     
    End Function

    Cdt
    Damran

  9. #9
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : février 2010
    Messages : 801
    Points : 1 099
    Points
    1 099
    Par défaut
    Oui Damran mais tu arrives un peu tard c'est ce que j'avais proposé en 1ère instance Compter le nbre de jours, diviser par 365, puis 30,etc. Mais finalement c'est pas assez précis. Vu qu'il y a des mois de 31 jours voire 28 ou 29 et des années de 366 jours....Donc j'ai modifié le code pour arriver à qqe chose de plus précis. J'ai fais plein de tests chez moi et j'ai pas eu de problème. Donc je voudrais bien avoir les exemples qui ne fonctionnent pas
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    août 2002
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2002
    Messages : 109
    Points : 78
    Points
    78
    Par défaut
    Bonjour et Merci de vos réponses,

    Pardon si je n'ai pu vous répondre plus tôt.

    Paidge, j'ai fait de mon mieux pour convertir le fichier, il en .mdb compatible Access 2000, je n'ai pas pu le convertir en 1997.

    Sur les 5 enregistrements, seul le N°4 est bon.
    Le 1er donne : 1 an 5 mois et 46 jours.
    Le 2ème : 1 an 1 mois 35 jours.
    Le 3ème : 1 an 3 mois et 36 jours.
    Le 4ème : 0 an 5 mois et 24 jours.
    Le 5ème : -1 an 11 mois 50 jours.

    Damran, je te remercie de ton aide. Je regarde attentivement ton code et je reviens vers vous.
    Merci Paidge et merci Damran.
    Fichiers attachés Fichiers attachés

  11. #11
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : février 2010
    Messages : 801
    Points : 1 099
    Points
    1 099
    Par défaut
    Je ne peux pas ouvrir ton fichier non plus...vraiment de la m**** ! cet ACCESS 97 T'aurais pu me donner directement les valeurs qui génèreent ces résultats Je suis curieux de les voir.
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    août 2002
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2002
    Messages : 109
    Points : 78
    Points
    78
    Par défaut
    Bonsoir Paidge,

    Je reviens vers toi seulement maintenant car je pense avoir trouvé la cause de l'erreur.
    Il s'agirait de la conversion. Je m'explique.
    Je travaille sous 2010 et l'erreur est apparue, semble-t-il, lorsque j'ai testé le fichier que j'ai converti de .accdb à .mdb.
    Je ne comprends pas.
    Toujours est-il que sous 2010, sauf erreur de ma part, les conversions vers access 97 sont impossibles. Cela s'arrête à Access 2000.
    J'ai retesté ce soir encore, ton code marche parfaitement.
    Je te remercie très sincèrement et plus encore pour la patience dont tu as fait preuve.
    Cordialement.

  13. #13
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    septembre 2007
    Messages
    804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2007
    Messages : 804
    Points : 1 702
    Points
    1 702
    Billets dans le blog
    5
    Par défaut
    Salut tout le monde
    vous trouvez ci_joint le module VBA amélioré et adapté pour MsAccess 2010.
    Fichiers attachés Fichiers attachés
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

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

Discussions similaires

  1. Convertir nombre de jours en année, mois et jours
    Par mehdiyou dans le forum VB.NET
    Réponses: 10
    Dernier message: 10/04/2014, 11h08
  2. Réponses: 3
    Dernier message: 09/11/2009, 15h00
  3. Réponses: 5
    Dernier message: 13/05/2008, 16h28
  4. Réponses: 7
    Dernier message: 18/06/2007, 17h40
  5. Réponses: 2
    Dernier message: 21/07/2006, 15h04

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