代码之家  ›  专栏  ›  技术社区  ›  Code Novice

在MS ACCESS查询中计算两个日期之间的完整月份

  •  1
  • Code Novice  · 技术社区  · 7 年前

    我在使用ACCESS DateDiff函数时遇到问题。我试图获取两个日期之间的完整月份,但是此函数忽略月中的日期。它显然是对月数本身进行简单的计算,而不考虑一个月的哪一天。

    Access Function: DateDiff(“m”,付款日期,静态日期)作为月

    下面的屏幕截图显示了我想要的数据以及我得到的结果之间不正确的月份。

    enter image description here

    enter image description here

    Oracle是我在ACCESS中尝试实现的一个示例

    Oracle Months_Between 函数考虑月份和闰年以及每个月内的天数,并输出值之间的实际月份。如果我知道如何在ACCESS中获取这个,我就不会发布这个问题。

    enter image description here

    1 回复  |  直到 6 年前
        1
  •  2
  •   Gustav    7 年前

    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
    
    推荐文章