【问题标题】:Access Age Range Query Not Returning Ages Less Than 1访问年龄范围查询不返回年龄小于 1
【发布时间】:2019-05-22 18:04:48
【问题描述】:

我的 Access 数据库中有一个查询,它需要 2 个用户输入的年龄并返回这些输入之间的数据库条目。当您输入一个最小值为 >=1 的范围时,它工作正常,但如果最小值为

最初我认为这可能与我计算年龄的方式有关(我在查询中即时执行此操作)所以我尝试了使用和不使用 datediff 函数: (日期()-[出生日期])/365.25 和 年龄:(DateDiff("y",[DOB],Date()))/365.25 但这些都对结果没有任何影响。它与年龄计算有关还是介于...和运算符之间有什么不工作?

这部分查询的完整SQL代码为:

DateDiff("y",[DOB],Date()))/365.25) Between [Forms]![AgeRangeQueryForm]![Youngest Age in Range] And [Forms]![AgeRangeQueryForm]![Oldest Age In Range]

整个查询的代码是(包括 Gustav 建议的编辑):

PARAMETERS [Forms]![AgeRangeQueryForm]![Youngest Age in Range] Short, [Forms]![AgeRangeQueryForm]![Oldest Age in Range] Short, [Forms]![AgeRangeQueryForm]![GenderOptionGroup] Short, [Forms]![AgeRangeQueryForm]![PostcodeSearch] Short;
SELECT [Carer Contact Details_1].[Parents Name], [Carer Contact Details_1].[Parents Surname], [Carer Contact Details_1].[Email Address], [Carer Contact Details_1].[Contact Number], [Carer Contact Details_1].Postcode, [Child Details1].[First Name], UCase(Left(Nz([Child Details1].[Gender],""),1)) AS Gender, Round((DateDiff("d",[DOB],Date())/365.25),2) AS Age, [Child Details1].DOB, [Child Details1].[Date of Last Test]
FROM [Carer Contact Details_1] INNER JOIN [Child Details1] ON [Carer Contact Details_1].[Parent ID] = [Child Details1].[Parent ID]
WHERE (((UCase(Left(Nz([Child Details1].[Gender],""),1))) Like Choose([Forms]![AgeRangeQueryForm]![GenderOptionGroup],"M","F","[MF]")) AND ((Round((DateDiff("d",[DOB],Date())/365.25),2)) Between [Forms]![AgeRangeQueryForm]![Youngest Age in Range] And [Forms]![AgeRangeQueryForm]![Oldest Age In Range]) AND ((Left([Carer Contact Details_1]![Postcode],Len(Nz([Forms]![AgeRangeQueryForm]![PostcodeSearch]))))=Nz([Forms]![AgeRangeQueryForm]![PostcodeSearch])));

显然,我的预期结果是它能够处理小于 1 的值,即可以搜索和查找 0.1 - 0.9 之间的值。目前,它返回空白。

我对 Access 和 SQL 都很陌生,因此如果我缺少明显的解决方案,我深表歉意。

提前致谢。

编辑:我想我会更新这个,因为我仍然有这个问题。我已经尝试了下面列出的两个建议(Gustav 和 SunKnight0),但都没有奏效。它仍然不会返回小于 1 岁的任何内容(有趣的是,如果我将查询的 Age 部分设置为以天为单位返回年龄,那么它不会返回小于 525 天的任何内容)。我认为这可能是由于我的搜索表单的“性别”字段中缺少值,因为它没有返回任何在该字段中没有条目的条目(无论年龄)。考虑到这一点,我添加了这一行:

((UCase(Left(Nz([Child Details1].[Gender],""),1)))

到我选择指定性别的查询部分。我已经更新了上面的整个查询,所以它反映了我最近的尝试。

我现在完全被难住了,为什么它不会返回任何东西。这与我用来计算年龄的函数有关吗? DateDiff 会自动舍入吗?

【问题讨论】:

    标签: ms-access


    【解决方案1】:

    它是“yyyy”,而不是“y”(一年中的哪一天) - 但使用一个可以正确计算年龄的函数,如下所示:

    Public Function AgeSimple( _
      ByVal datDateOfBirth As Date) _
      As Integer
    
    ' Returns the difference in full years from datDateOfBirth to current date.
    '
    ' Calculates correctly for:
    '   leap years
    '   dates of 29. February
    '   date/time values with embedded time values
    '
    ' 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.
    ' After an idea of Markus G. Fischer.
    '
    ' 2007-06-26. Cactus Data ApS, CPH.
    
      Dim datToday  As Date
      Dim intAge    As Integer
      Dim intYears  As Integer
    
      datToday = Date
      ' Find difference in calendar years.
      intYears = DateDiff("yyyy", datDateOfBirth, datToday)
      If intYears > 0 Then
        ' Decrease by 1 if current date is earlier than birthday of current year
        ' using DateDiff to ignore a time portion of datDateOfBirth.
        intAge = intYears - Abs(DateDiff("d", datToday, DateAdd("yyyy", intYears, datDateOfBirth)) > 0)
      End If
    
      AgeSimple = intAge
    
    End Function
    

    那么您的查询将是:

    Parameters 
        [Forms]![AgeRangeQueryForm]![Youngest Age in Range] Short,
        [Forms]![AgeRangeQueryForm]![Oldest Age In Range] Short;
    Select
        *,
        AgeSimple([DOB])
    From
        YourTable
    Where
        AgeSimple([DOB]) Between [Forms]![AgeRangeQueryForm]![Youngest Age in Range] And [Forms]![AgeRangeQueryForm]![Oldest Age In Range]
    

    【讨论】:

    • 嗨古斯塔夫,谢谢。但我不确定这是否有效有两个原因:
    • 1.当 DOB 小于一年时(由于 Int 向下舍入),在 VBA 模块即时窗口中对其进行测试会返回 0。这不是我所追求的。如果数据未满 1 岁,我希望它仍将数据作为一年的一部分返回。如果我将所有 Dim intAge 和 intYears 更改为双打加载,它仍然有效吗? 2. 当我尝试在我的查询中运行它时,它给了我一个错误,它太长/太复杂而无法运行,或者特定的选择命令无效。
    • 1.如果您不想计算年数,请计算月数,但低于 1 的年数为 0(零),因此如果应包括婴儿,请在 [Youngest Age in Range] 中设置 0。 2. 指定参数的数据类型可能会有所帮助。请查看扩展答案。
    • 我调整了你的函数,以便在年龄小于 1 时为我提供所需的输出,但它仍然不能作为查询的一部分工作。即使按照您的建议添加了参数命令。我已更新问题以包含整个查询,以防有其他部分导致问题。
    • 您可能还必须将其余参数(来自表单)添加到 Parameters 部分。
    【解决方案2】:

    要获得以天为单位的年龄(然后除以 365.25 以获得小数年份),请使用

    DateDiff("d",[DOB],Date())
    

    不是

    DateDiff("y",[DOB],Date())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 2015-04-14
      • 2015-07-17
      • 1970-01-01
      • 2011-08-11
      • 2018-10-29
      • 2015-05-22
      相关资源
      最近更新 更多