2016-11-06 50 views
0

最近学习访问,但发现自己吸了一个特定的公式。 我一直在努力寻找一种方法来计算从雇员的雇用日期和特定日期代替今天以来的年数。 我搜索并尝试了几个Datediff和DATEDIF没有运气只是得到负面结果,如果有的话。任何帮助是极大的赞赏。访问2016年公式

回答

0

这是因为它不是那么容易,并且有一些陷阱,的确如果你想正确计算闰年考虑。

关键是要在这个函数总是使用使用DateAdd为:

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 

典型用途:

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

注意,对于有人在本月1日起聘请,全就业年数将计算在该月的下一个月份,因此表达式可能更确切些:

HiredYears = Years([HireDate], #1/1/2018#) 
+0

谢谢你的帮助。我已经尝试过datediff(“yyyy”,[Hiredate],12/312017),但得到负三位数字。我切换它并获得正数,但仍然是三位数字。我必须找出从聘用日期到今天12/31/2017之间的几年时间。 –

+0

_12/312017_不是有效日期。为什么在无法完成工作时使用_DateDiff_运行?这就是我发布该功能的原因。请参阅编辑使用情况。 – Gustav