2017-03-16 15 views
0

次のフィールドを含むテーブル(Service_records)があります。MS四半期開始時のアクセスユーザー年齢

カスタマーID

四半期(Q1、Q2、Q3、Q4)
サービス
コスト

例えば、顧客の個人情報を持つテーブル(Customer_records)もあります顧客IDによってリンクされたDoB)を、後続のクエリで上記のテーブルに追加します。

また、財務年度のリスト(Financial_years)もあります。

16分の2015
17分の2016
18分の2017

私は会計年度が表示されますコンボボックスと、クエリを開くためのボタンがあり、簡単なフォームを作成しました。

クエリは現在、すべての上記のテーブルとクロス集計クエリであり、それは--- Q1 -------------

等列と行とクォーターとしてサービスを示しますQ2 --- Q3 --- Q4
サービス1 |
サービス2 |
サービス3 |

私がしたいのは、サービスを受けた顧客IDのうち、その四半期に30〜35歳(四半期の初めに30を超えたもの)だった顧客IDの数を、四半期はQ1-Apr-June、Q2-July-Sep、Q3-Sep-Dec、Q4 Jan-Marを実行します。

これはできますか?

答えて

1

あなたが最初に正しくこのような完全な年で年齢を計算する機能が必要になります。

Public Function Years(_ 
    ByVal datDate1 As Date, _ 
    ByVal datDate2 As Date, _ 
    Optional ByVal booLinear As Boolean) _ 
    As Integer 

' Returns the difference in full years 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 year counts. 
' For a given datDate1, if datDate2 is decreased step wise one year 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 years to dates of Feb. 29. 
' when the resulting year is a common year. 
' 
' 2007-11-13. Cactus Data ApS, CPH. 

    Dim intDiff As Integer 
    Dim intSign As Integer 
    Dim intYears As Integer 

    ' Find difference in calendar years. 
    intYears = DateDiff("yyyy", datDate1, datDate2) 
    ' For positive resp. negative intervals, check if the second date 
    ' falls before, on, or after the crossing date for a full 12 months 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("yyyy", intYears, datDate1), datDate2)) 
    intDiff = Abs(intSign < 0) 
    Else 
    intSign = Sgn(DateDiff("d", DateAdd("yyyy", -intYears, datDate2), datDate1)) 
    If intSign <> 0 Then 
     ' Offset negative count of years to continuous sequence if requested. 
     intDiff = Abs(booLinear) 
    End If 
    intDiff = intDiff - Abs(intSign < 0) 
    End If 

    ' Return count of years as count of full 12 months periods. 
    Years = intYears - intDiff 

End Function 

次に例えば、あなたの四半期の開始日を計算する関数を作成:

Public Function CalendarQuarterStart(_ 
    ByVal FinancialYear As String, _ 
    ByVal FinancialQuarter As String) _ 
    As Date 

    Dim CalendarYear As Integer 
    Dim CalendarMonth As Integer 
    Dim DateStart As Date 

    CalendarYear = Val(FinancialYear) ' "2015/16" 
    CalendarMonth = 1 + 3 * Right(FinancialQuarter, 1) ' "Q3" 

    DateStart = DateSerial(CalendarYear, CalendarMonth, 1) 

    CalendarQuarterStart = DateStart 

End Function 

したがって、あなたのクエリで:

Age: Years([DateOfBirth], CalendarQuarterStart([FinancialYear],[FinancialQuarter])) 
+0

私はこれを試して、それはほとんど動作しますが、年のQ4になると年齢が下がるQ2 Q3 Q4と比較して年。例えば、ドブを1980年1月3日に、選択した年を2016-17年とすると、Q1 = 36、Q2 = 36、Q3 = 36、Q4(2017)= 35になる。 – Naz

+0

はい、何か混乱してしまいました。修正済み - 編集済みの回答を参照してください。 – Gustav

関連する問題