Microsoft Access显示月份和年份的差异

时间:2016-02-17 02:53:44

标签: ms-access datediff date-difference

如何显示2013年访问权限的年份和月份差异。我一直在使用DateDiff公式,但它没有工作。似乎DateDiff只能显示其中一个符号(m,yyyy或d)。如果DateDiff无法显示月份和年份,是否还有其他可用的代码?

2 个答案:

答案 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)

我让它工作得很好。以下是我如何应用它: enter image description here

然后你可以看到结果: enter image description here

答案 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