如何显示2013年访问权限的年份和月份差异。我一直在使用DateDiff公式,但它没有工作。似乎DateDiff只能显示其中一个符号(m,yyyy或d)。如果DateDiff无法显示月份和年份,是否还有其他可用的代码?
答案 0 :(得分:0)
只进行了一些测试......我会在不需要的时候将其清理一下,以便考虑复数,但这应该会给你一个良好的开端:
' Calculate Years and Months Difference
Private Sub btnCalculate_Click()
Dim intYears As Integer
Dim intMonths As Integer
intYears = (DateDiff("m", Me.txtDateStart, Me.txtDateEnd) / 12)
intMonths = (DateDiff("m", Me.txtDateStart, Me.txtDateEnd) Mod 12)
Me.lblDifference.Caption = intYears & " Years " & intMonths & " Months"
End Sub
补充新的解释: 我没有测试过,但在查询中你应该能够以同样的方式进行测试:将这些表达式放在列标题中
TotalYears:=(DateDiff("m", [dtStartDate], [dtEndDate]) / 12)
在另一个列标题中:
TotalMonths:=TotalYears:=(DateDiff("m", [dtStartDate], [dtEndDate]) Mod 12)
答案 1 :(得分:0)
您不能这么做,因为 DateDiff 显示日历年或月之间的差异,而不是时间跨度。上述尝试将返回此序列:
d1: 2016-02 d2: 2016-08 Y: 0 M: 6
d1: 2016-02 d2: 2016-09 Y: 0 M: 7
d1: 2016-02 d2: 2016-10 Y: 0 M: 8
d1: 2016-02 d2: 2016-11 Y: 0 M: 9
d1: 2016-02 d2: 2016-12 Y: 0 M: 10
d1: 2016-02 d2: 2017-01 Y: 1 M: 11
d1: 2016-02 d2: 2017-02 Y: 1 M: 0
d1: 2016-02 d2: 2017-03 Y: 1 M: 1
d1: 2016-02 d2: 2017-04 Y: 1 M: 2
d1: 2016-02 d2: 2017-05 Y: 1 M: 3
d1: 2016-02 d2: 2017-06 Y: 1 M: 4
对于真正的时间跨度,你必须使用这样的函数:
Public Function YearsMonthsDays( _
ByVal datDate1 As Date, _
ByVal datDate2 As Date, _
Optional ByRef lngYears As Long, _
Optional ByRef lngMonths As Long, _
Optional ByRef lngDays As Long) _
As String
' Returns the difference in years, months, and days 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)
'
' Gustav Brock, Cactus Data ApS.
' 2010-03-30.
' Count of months in a calendar year.
Const cintMonths As Integer = 12
Dim datDateMonth As Date
Dim intDays As Integer
' No special error handling.
On Error Resume Next
lngMonths = Months(datDate1, datDate2)
datDateMonth = DateAdd("m", lngMonths, datDate1)
lngDays = DateDiff("d", datDateMonth, datDate2)
intDays = Sgn(lngDays)
If intDays <> 0 Then
If intDays <> Sgn(DateDiff("d", datDate1, datDate2)) Then
lngDays = 0
End If
End If
lngYears = lngMonths \ cintMonths
lngMonths = lngMonths Mod cintMonths
YearsMonthsDays = CStr(lngYears) & " year(s), " & CStr(lngMonths) & " month(s), " & CStr(lngDays) & " day(s)"
End Function
使用这个辅助函数:
Public Function Months( _
ByVal datDate1 As Date, _
ByVal datDate2 As Date, _
Optional ByVal booLinear As Boolean) _
As Integer
' Returns the difference in full months 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 month counts.
' For a given datDate1, if datDate2 is decreased stepwise one month 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 months to dates of Feb. 29.
' when the resulting year is a common year.
'
' 2010-03-30. Cactus Data ApS, CPH.
Dim intDiff As Integer
Dim intSign As Integer
Dim intMonths As Integer
' Find difference in calendar months.
intMonths = DateDiff("m", datDate1, datDate2)
' For positive resp. negative intervals, check if the second date
' falls before, on, or after the crossing date for a 1 month 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("m", intMonths, datDate1), datDate2))
intDiff = Abs(intSign < 0)
Else
intSign = Sgn(DateDiff("d", DateAdd("m", -intMonths, datDate2), datDate1))
If intSign <> 0 Then
' Offset negative count of months to continuous sequence if requested.
intDiff = Abs(booLinear)
End If
intDiff = intDiff - Abs(intSign < 0)
End If
' Return count of months as count of full 1 month periods.
Months = intMonths - intDiff
End Function