我想你可以計算出這樣的:使用這樣的函數
RetentionMonths = Months(RetentionStartDate, Date)
:
RetentionStartdate = DateAdd("ww", 14, DateAdd("d", vbSaturday - Weekday(HireDate), HireDate))
從此,你可以指望整月
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
現在,用於查詢中,創建一個幫助函數:
Public Function RetentionMonths(ByVal HireDate As Date) As Integer
Dim RetentionStartdate As Date
RetentionStartdate = DateAdd("ww", 14, DateAdd("d", vbSaturday - Weekday(HireDate), HireDate))
RetentionMonths = Months(RetentionStartDate, Date)
End Function
保存此功能的代碼模塊中,和您的查詢可能看起來像:
Select *, RetentionMonths([HireDate]) As RetentionMonths
From YourTable
古斯塔夫,非常感謝您爲您的答覆!不幸的是,我顯然沒有得到正確的結果。我試圖在VBA中使用?Months(date1,date2)運行函數,但無論我輸入什麼日期,我總是得到0.我仍然繼續惹惱它 - 我確信它可能是一個真正的我正在做的愚蠢的錯誤。 :) – Zuzu
請確保您的date1和date2是真實的日期值。 – Gustav
謝謝先生,這絕對是問題:)我不想問你其他任何人 - 但你可能只是澄清我在哪裏放置前兩行代碼?它似乎無處不在我試圖把它們,它有一些問題... VBA代碼不喜歡「WW」,把它放在一個窗體只是給我「#Name?」作爲一個表達,它說它包含語法錯誤...我很抱歉打擾你,我顯然還在學習基礎知識。我真的非常感謝你幫助我的無望的新手自我! – Zuzu