2017-05-26 102 views
0

數學和編碼都不是我的事情,所以我真的希望有人能幫助我解決這個問題。我深深地被困在這個問題上......MS Access:設定值爲第14週週日的日期

情景:客戶達到13周的就業後,我們開始計算保留月份。所以在WeeksTotal達到13之後,接下來的星期日標誌着保留的第一個月的開始。

簡而言之

所以...

當WeeksTotal是< 13: MonthsCurrentJob應等於0

當WeeksTotal> = 13:

  1. RetentionStartdate值應被設置爲第14週週日的日期

  2. MonthsCurrentJob應該使用RetentionSta rtdate來計算月至今

  3. 1應加入MonthsCurrentJob

    價值

這很可能是(也許)是去這樣做這個完全錯誤的方式。但我希望這解釋了我想要完成的事情。如果任何人都能指引我走向正確的方向,我會犧牲一隻山羊以紀念你。好吧,也許不是......但你會有我永恆的讚賞和欽佩!

回答

0

我想你可以計算出這樣的:使用這樣的函數

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 
+0

古斯塔夫,非常感謝您爲您的答覆!不幸的是,我顯然沒有得到正確的結果。我試圖在VBA中使用?Months(date1,date2)運行函數,但無論我輸入什麼日期,我總是得到0.我仍然繼續惹惱它 - 我確信它可能是一個真正的我正在做的愚蠢的錯誤。 :) – Zuzu

+0

請確保您的date1和date2是真實的日期值。 – Gustav

+0

謝謝先生,這絕對是問題:)我不想問你其他任何人 - 但你可能只是澄清我在哪裏放置前兩行代碼?它似乎無處不在我試圖把它們,它有一些問題... VBA代碼不喜歡「WW」,把它放在一個窗體只是給我「#Name?」作爲一個表達,它說它包含語法錯誤...我很抱歉打擾你,我顯然還在學習基礎知識。我真的非常感謝你幫助我的無望的新手自我! – Zuzu

相關問題