VBA:DateDiff年假

时间:2011-05-02 19:32:50

标签: vba access-vba

我在VBA中有以下代码,用于返回两个日期之间的年份:DateDiff("yyyy", "10/10/1930","06/07/2008 8:30:00 AM")
它返回 78 ,但它应该 77 这是怎么回事?

4 个答案:

答案 0 :(得分:5)

VBA的DateDiff功能并非旨在追踪已用时间。该声明只是评估这一年。

请参阅此msdn文章,该文章提供了计算已用年数的函数:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvbadev/html/workingwithelapsedtime.asp

Function elapsed_years_function(first_date As Date, Optional second_date As Date = 0) As Integer
' This procedure is from http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvbadev/html/workingwithelapsedtime.asp
Dim elapsed_years As Integer
If second_date = 0 Then
' Did the caller pass in a date? If not, use
' the current date.
second_date = Date
End If
elapsed_years = DateDiff("yyyy", first_date, second_date)
If second_date < DateSerial(Year(second_date), Month(first_date), Day(first_date)) Then
elapsed_years = elapsed_years - 1
End If
elapsed_years_function = elapsed_years
End Function

答案 1 :(得分:4)

编辑:根据this(VB.Net)正如@Justin所指出的,这适用于VB.Net,而不是Visual Basic,但实现很可能是相同的向后兼容性。为了完整起见,我在下面引用了相关的VBScript文档。

  

更长的间隔。如果设置了间隔   到DateInterval.Year,返回值   纯粹是从年份计算出来的   Date1和Date2的一部分。同样的,   的返回值   计算DateInterval.Month   纯粹来自年份和月份   的论点和   来自宿舍的DateInterval.Quarter   包含两个日期。

     

例如,比较12月   次年31日至次年1月1日,   DateDiff返回1表示   DateInterval.Year,   DateInterval.Quarter,或   DateInterval.Month,即使在   大多数只有一天过去了。

另见this(VBScript):

  

比较12月31日到1月   紧接着的一年中有一年,   DateDiff for Year(“yyyy”)返回1   即使只有一天过去了。

所以它可能会像这样实现,它提供 78

Year(SecondDate) - Year(FirstDate)

请参阅@ Ken的解决方案,了解应该按预期工作的实现。

答案 2 :(得分:2)

如果您使用DateDiff(“yyyy”,“12/31/2010”,“1/1/2011”),它将返回1,即使只有一天的差异。

答案 3 :(得分:0)

按设计工作:请参阅http://msdn.microsoft.com/en-us/library/b5xbyt6f%28v=vs.80%29.aspx WHICH STATES:

下的备注(更大的间隔)

如果Interval设置为DateInterval.Year,则返回值仅从Date1和Date2的年份部分计算。

当你按年度做日期时,所执行的操作是2008年至1930年