Je suis en retard, mais le problème est intéressant. De plus j'ai trouvé une solution qui retourne le bon résultat avec des dates quelconques. date1 > date2, date1 = date2, date1 < date2
Objectif : calculer le nombre d'années, de mois et de jours de travail d'un employé entre la date d'embauche et une date de fin.
À mon avis, la technique de la période reportée, proposée par Fabrice, ne peut pas fonctionner. Elle calcule le nombre de jours entre deux dates et reporte ce nombre de jours sur une autre période. Si la période initiale inclut une année bissextile et que la période reportée n'en inclut pas, on aura un décalage.
Ma solution est une fonction personnalisée. Elle utilise la récursivité. Elle déplace la date de début par bloc mensuel tant et aussi longtemps que la date (date d'étape) est à l'intérieur des limites. Lorsqu'elle a trouvé le nombre de mois, elle utilise la date d'étape pour calculer le nombre de jours restants.
Exemple 1 : Un employé qui a travaillé du 15 décembre 2022 au 15 décembre 2022 à travailler 1 jour.
Exemple 2 : Un employé qui a travaillé du 15 décembre 2022 au 14 janvier 2023 à travailler 1 mois.
Exemple 2 : Un employé qui a travaillé du 15 décembre 2022 au 15 décembre 2023 à travailler 1 an et 1 jour
Exemple 3 : Un employé qui a terminé son emploi le 15 décembre 2023 et avait commencé à travailler le 15 décembre 2022 à travailler 1 an, 0 mois et 1 jour
HTH
/**
uDate_00ObtenirDecompteAMJ ( date1 ; date2 )
Retourne une liste comportant le décompte des années, des mois et des jours inclus entre les 2 dates reçues. Les dates sont incluses.
Retourne une liste 3 valeurs.
Les dates peuvent être quelconques, mais doivent être valides.
Fonction privée publique
**/
///date2 = Date ( 12 ; 15 ; 2022 )
///date1 = Date ( 12 ; 15 ; 2023 )
TantQue ([
vDate01 = ObtenirDate ( date1 ) ;
vDate02 = ObtenirDate ( date2 ) ;
vDateDepart = Si ( vDate01 > vDate02 ; vDate02 ; vDate01 ) ;
vDateFin = Si ( vDate01 > vDate02 ; vDate01 ; vDate02 ) ;
vEstDansLimite = 1 ;
vDecalage = 0
];
vEstDansLimite
;[
vDecalage = vDecalage + 1 ;
vDateTest = Date ( Mois ( vDateDepart ) + vDecalage ; Jour ( vDateDepart ) - 1 ; Annee ( vDateDepart ) ) ;
vDateEtape = Date ( Mois ( vDateDepart ) + ( vDecalage-1 ) ; Jour ( vDateDepart ) - 1 ; Annee ( vDateDepart ) ) ;
vEstDansLimite = vDateTest ≤ vDateFin
];
Liste ( Div ( vDecalage-1 ; 12 ) ; Mod ( vDecalage-1 ; 12 ) ; vDateFin-vDateEtape )
)