Ms access MS Access季度开始时的人员年龄

Ms access MS Access季度开始时的人员年龄,ms-access,Ms Access,我有一个包含以下字段的表(Service_records) 客户ID 年份 季度(第一季度、第二季度、第三季度、第四季度) 服务 成本 还有一个表(Customer_records),其中包含客户个人详细信息,如姓名和DoB,通过客户ID链接到后续查询中的上表) 我还有一张表,其中列出了财政年度(财政年度),例如: 2015/16 2016/17 2017/18 我创建了一个简单的表单,它有一个组合框,可以显示财政年度,然后是一个打开查询的按钮 该查询当前是一个包含上述所有表的交叉表查询,它以行

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

客户ID
年份
季度(第一季度、第二季度、第三季度、第四季度)
服务
成本

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

我还有一张表,其中列出了财政年度(财政年度),例如:

2015/16
2016/17
2017/18

我创建了一个简单的表单,它有一个组合框,可以显示财政年度,然后是一个打开查询的按钮

该查询当前是一个包含上述所有表的交叉表查询,它以行和列的形式显示服务,如

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

我想做的是计算在所选年度的该季度(季度第一天>30岁)内接受服务的客户ID的数量,我们的季度运行第一季度4月6日、第二季度7月9日、第三季度9月12日、第四季度1月3日


可以这样做吗?

您首先需要一个函数来正确计算完整年份的年龄,如下所示:

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
因此,在您的查询中:

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

我尝试过这个,它几乎奏效,但当你到了一年的第四季度,年龄比第二季度下降了一年。例如,如果出生日期为1980年1月3日,选择的年份为2016-17年,我的年龄为Q1=36,Q2=36,Q3=36,Q4(2017)=35。是的,我的年龄有点混淆。更正-请参阅编辑的答案。
Age: Years([DateOfBirth], CalendarQuarterStart([FinancialYear],[FinancialQuarter]))