【问题标题】:MS Access person age at quarter start季度开始时的 MS Access 人员年龄
【发布时间】:2017-03-16 15:41:38
【问题描述】:

我有一个包含以下字段的表(Service_records);

客户 ID
年份
季度(Q1、Q2、Q3、Q4)
服务
费用

还有一个包含客户个人详细信息的表 (Customer_records),例如在后续查询中通过客户 ID 将名称和 DoB 链接到上表)。

我还有一个包含财政年度(Financial_years)列表的表格,例如

2015/16
2016/17
2017/18

我创建了一个简单的表单,其中包含一个组合框,用于显示财政年度,然后是一个用于打开查询的按钮。

当前查询是一个包含上述所有表的 CrossTab 查询,它将服务显示为行,将季度显示为列

-------------Q1----Q2---Q3---Q4
服务1|
服务2|
服务3|

我想做的是计算所选年份、我们的季度在该季度(季度第一天 >30 岁)期间接受服务的客户 ID 的数量运行 Q1-Apr-6、Q2-7-9、Q3-Sep-Dec、Q4 Jan-3。

这个可以吗?

【问题讨论】:

    标签: ms-access


    【解决方案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]))
    

    【讨论】:

    • 我试过这个,它几乎可以工作,但是当你到一年的第四季度时,与第二季度第三季度第四季度相比,年龄下降了一年。例如,出生日期为 1980 年 1 月 3 日,选择的年份为 2016-17,我的年龄为 Q1 = 36,Q2=36,Q3=36,Q4(2017)=35。
    • 是的,我弄混了一些东西。已更正 - 请参阅编辑后的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 2021-09-10
    • 2016-03-14
    • 2021-04-12
    • 2021-12-29
    • 2018-03-27
    • 2021-10-22
    相关资源
    最近更新 更多