2016-11-06 6 views
0

Learning Access vor kurzem, aber finde mich saugen auf eine bestimmte Formel. Ich habe versucht, einen Weg zu finden, um die Anzahl der Jahre seit dem Einstellungsdatum eines Mitarbeiters und ein bestimmtes Datum anstelle von heute zu berechnen. Ich suchte und probierte einige Datediff und DATEDIF ohne Glück nur bekommen negative Ergebnisse, wenn überhaupt. Jede Hilfe wird sehr geschätzt.Access 2016 Formel

Antwort

0

Das ist, weil es nicht so einfach ist und es gibt einige Fallen, in der Tat, wenn Sie korrekt zählen wollen, unter Berücksichtigung von Schaltjahren.

ist der Trick immer DateAdd wie in dieser Funktion zu verwenden:

Public Function Years(_ 
    ByVal datDate1 As Date, _ 
    ByVal datDate2 As Date, _ 
    Optional ByVal booLinear As Boolean) _ 
    As Integer 

' Returns the difference in full years between datDate1 and datDate2. 
' 
' Calculates correctly for: 
' negative differences 
' leap years 
' dates of 29. February 
' date/time values with embedded time values 
' negative date/time values (prior to 1899-12-29) 
' 
' Optionally returns negative counts rounded down to provide a 
' linear sequence of year counts. 
' For a given datDate1, if datDate2 is decreased step wise one year from 
' returning a positive count to returning a negative count, one or two 
' occurrences of count zero will be returned. 
' If booLinear is False, the sequence will be: 
' 3, 2, 1, 0, 0, -1, -2 
' If booLinear is True, the sequence will be: 
' 3, 2, 1, 0, -1, -2, -3 
' 
' If booLinear is False, reversing datDate1 and datDate2 will return 
' results of same absolute Value, only the sign will change. 
' This behaviour mimics that of Fix(). 
' If booLinear is True, reversing datDate1 and datDate2 will return 
' results where the negative count is offset by -1. 
' This behaviour mimics that of Int(). 

' DateAdd() is used for check for month end of February as it correctly 
' returns Feb. 28. when adding a count of years to dates of Feb. 29. 
' when the resulting year is a common year. 
' 
' 2007-06-22. Gustav Brock, Cactus Data, CPH. 

    Dim intDiff As Integer 
    Dim intSign As Integer 
    Dim intYears As Integer 

    ' Find difference in calendar years. 
    intYears = DateDiff("yyyy", datDate1, datDate2) 
    ' For positive resp. negative intervals, check if the second date 
    ' falls before, on, or after the crossing date for a full 12 months period 
    ' while at the same time correcting for February 29. of leap years. 
    If DateDiff("d", datDate1, datDate2) > 0 Then 
    intSign = Sgn(DateDiff("d", DateAdd("yyyy", intYears, datDate1), datDate2)) 
    intDiff = Abs(intSign < 0) 
    Else 
    intSign = Sgn(DateDiff("d", DateAdd("yyyy", -intYears, datDate2), datDate1)) 
    If intSign <> 0 Then 
     ' Offset negative count of years to continuous sequence if requested. 
     intDiff = Abs(booLinear) 
    End If 
    intDiff = intDiff - Abs(intSign < 0) 
    End If 

    ' Return count of years as count of full 12 months periods. 
    Years = intYears - intDiff 

End Function 

Typische Anwendungen:

HiredYears = Years([HireDate], #12/31/2017#) 

Hinweis, dass am 1. eines Monats gemietet jemand für eine vollständige Das Beschäftigungsjahr wird am nächsten 1. des Monats gezählt, so dass der Ausdruck eher lautet:

+0

Vielen Dank für Ihre Hilfe. Ich habe den datediff ("yyyy", [Hiredate], 12/312017) ausprobiert, bekomme aber eine negative dreistellige Zahl. Ich schalte es um und bekomme eine positive Nummer, aber immer noch drei Ziffern. Ich muss die Zeit in Jahren zwischen dem Datum, das eingestellt wird, und dem 31.12.2017 als dem heutigen Datum finden. –

+0

_12/312017_ ist kein gültiges Datum. Und warum laufen Sie mit _DateDiff_, wenn es den Job nicht erledigen kann? Deshalb habe ich die Funktion gepostet. Siehe zur Verwendung bearbeiten. – Gustav

Verwandte Themen