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