-1
votes

Comment calculer le mois avec la fraction dans l'accès VBA

J'ai besoin d'écrire une fonction qui reçoit deux arguments startdate et enddate où il renvoie la différence entre ces deux dates.

dire que la fonction est MonthfractionDiff (startDate, enddate)

E.g. MonthfractionDiff (15/01/2016,15 / 02/2016) retournera ((31-15) / 31) + (15/29) = 1.0333704116

MonthfractionDiff (15/11/2018,15 / 02/2019) retournera ((30-15) / 30) + 1 + 1 + (15/28) = 3.0357142857

I Vainly essayé https://access-programers.co. UK / Forums / Showthread.php? T = 113589


4 commentaires

Postez le code actuel que vous avez essayé et indiquez quelle partie de cela ne fonctionne pas correctement. "Vainly Essayy" pourrait être une faute de frappe dans ce que vous avez repéré, il pourrait être que vous avez manqué une ligne en copie / pâte, il est difficile de dire ...


@Freeman j'ai essayé au-dessus du code (tel que posté par Pstraton), il fonctionne lorsque la date de début et de fin est la même année, mais cela ne va pas lorsque les deux dates sont différentes. StartDate en 2018 et seddate en 2019.


Regardez le fil que vous mentionnez, faites défiler et essayez le code de l'utilisateur pstraton .


Merci pour votre réponse. Mise à jour mon commentaire.Does ça marche vraiment?


3 Réponses :


1
votes

mis à jour grâce à une autre réponse weebee xxx


6 commentaires

Merci! Mais il ne calculait pas non plus la fraction correcte du mois par exemple. HOWMANMONNTHS (03 décembre 2018, 17 juin 2019) Retours 6.5032 Qui serait 29/31 + 1 + 1 + 1 + 1 + 1 + 17/30 = 6.50215053762 ou 6.5022


@Sislam qui est une approche différente de ce que vous avez dit précédemment. Dans votre premier exemple avec novembre, vous avez fait la date de soustraire des jours au total divisé par des jours totaux, donc: (30-15) /30=0.5 . Mais avec votre exemple de 3 décembre, vous montrez 29/31 qui est une approche différente. Basé sur votre exemple précédent, ce serait lequel équivaut à 28, au lieu de vous 31-2 pour obtenir 29 sur 31. Cela expliquerait votre différence. Si vous souhaitez inclure la date de début (comme vous l'avez fait pour vos exemples de décembre), il est facile de changer.


MonthfractionDiff (15/01/2016,15 / 02/2016) retournera ((31-15) / 31) + (15/29) = 1.0333704116 ici (31-15) = (Journées totales dans ce mois) Portion de la date de début


@Sislam Désolé, je ne comprends pas. Bonne chance.


Désolé si vous ne comprenez pas. MonthfractionDiff (15/01/2016,15 / 02/2016) retournera ((31-15) / 31) + (15/29) = 1.0333704116 ici (31-15) = (jours total en janvier mois) - (partie de jour de la date de début, soit 15)


Oui, je vois que ... 15 janvier au 15 février dans une année bissextile est égal à 1.0337 (31-15) = 16/31 + 15/9.Quez ce que ma formule revient, et c'est ce que vous avez répertorié comme le résultat attendu de votre exemple . Ce n'est pas la même approche dans l'exemple de votre 3 décembre qui est = (31-3) = qui montre vingt-neuf au lieu de 28 divisé par 31.



1
votes

J'irais avec datrodiff ().

datediff("d", "01/01/2019", date())/30.5


4 commentaires

J'aime mieux votre approche globale (c'est-à-dire de la prétendance du mois), mais l'OP indique clairement qu'il / elle cherche chaque mois à convertir en pourcentage de temps relatif du mois. Votre formule ne correspond pas tout à fait car elle retournerait 1.0163 pour l'exemple Janvier / FEB au lieu de 1.0337.


Oui, ma formule n'a pas votre niveau de précision, c'est une approche mathématique.


J'ai volé une partie de votre réponse (et j'ai payé pour cela avec un obscurci!). Le datrodiff est une meilleure approche que mon idée de boucle.


Merci, @pgcoderider!



1
votes

Comme le nombre de jours de jour varie, vous devez compter en jours pour obtenir le plus près possible, comme il n'y a jamais (sauf en un mois ou en juillet / août ou en décembre / janvier) sera une valeur exacte:

? TotalMonths(#2016/01/15#, #2016/02/15#)
 1.03 

? TotalMonths(#2018/11/15#, #2019/02/15#)
 3.03 


2 commentaires

On dirait tout à fait l'effort d'obtenir jours-month . Voir mon approche ci-dessous: Journée (datestérien (année (startdate), mois (startdate) + 1, 1) - 1)


@PGCODERIDER: Il provient d'une bibliothèque structurée.