【问题标题】:MS Access : Dealing with today's date in calculated field expressionMS Access:在计算字段表达式中处理今天的日期
【发布时间】:2015-11-28 06:44:24
【问题描述】:

您好,我正在 MS Access 中创建一个表来存储学校儿童的详细信息。

我有一个名为 YearGroup 的字段,它需要根据他们的出生日期以及他们是否上调或下调一年来计算他们所在的学年。

即如果表达式认为他们是 6 岁,则应将其放在第 2 年。如果将它们向下或向上移动一年,则应在 1 年或 3 年(这基于表中名为 YearModifier 的另一个字段)。

我现在的代码是这样的:

Year(Now()) - IIf(Month([DOB]) > 8, Year([DOB]) + 6 + [YearModifier], Year([DOB]) + 5 + [YearModifier])

我的问题是Year(Now()) 作为无效表达式返回。许多网站已经使用 Now() 函数识别,我也尝试过 Date() 但 Access 似乎没有接受任何内容(版本是 2010)。

发生了什么事?如何在计算字段表达式中获取今天的日期?

谢谢

【问题讨论】:

  • 哦,IIf 是关于他们的生日是在九月之前还是之后,即下一学年的截止点。
  • 你在字段的哪个属性中有这个表达式?默认值?
  • 由于某种原因,此数据类型没有默认值。这是在“表达式”属性中
  • 为了简单一点,真正的问题在于这个错误:表达式 Year(Now()) 不能在计算列中使用。
  • 您可以尝试在查询中计算它。一项小研究表明,日期函数不能用于计算列(例如social.msdn.microsoft.com/Forums/office/en-US/…)。

标签: date ms-access ms-access-2010


【解决方案1】:

尝试使用表中的所有字段创建一个查询,然后添加一个额外字段YearGroup: Year(Now()) - IIf(Month([DOB]) > 8, Year([DOB]) + 6 + [YearModifier], Year([DOB]) + 5 + [YearModifier])

日期函数似乎不能用于表格的计算列。

【讨论】:

  • 日期函数可以像任何其他函数一样在查询中使用。
【解决方案2】:

您可以使用它来获取年份,这可能适用于字段表达式:

格式(日期(),“yyyy”)

关于你的函数(我已经稍微改写了)

Year( Now() ) 
- Year([DOB])
- IIf(  Month([DOB]) > 8
      , 6 
      , 5 )
+ [YearModifier]

然而!

我认为你不想使用 now()。他们在哪一年取决于他们在当前学年开始时的 9 月 1 日的年龄,而不是现在!好的,现在将工作到 2015 年 12 月 31 日,所以我必须假设您在此日期之后不会使用该功能!

如果你是,你必须使用 2015 而不是 Now()。

好吗?

【讨论】:

    【解决方案3】:

    你可以用一个简单的函数计算孩子的年龄:

    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
    

    那么你的表达式会是这样的(忽略修饰符):

    ClassYear: IIf(AgeSimple([DOB]) > 6, 2, 1)

    【讨论】:

    • 作为 Access/VBA 开发的新手,我不确定这段代码的放置位置。我添加了一个模块并创建了一个返回 True 或 False 的函数,我想根据该函数设置计算字段(是/否)。表达式生成器不显示我在函数下列出的新函数,并且也拒绝手动输入表达式。你能指出我哪里错了吗?谢谢!
    • 将上面的内容复制粘贴到模块中,编译保存即可。
    • 在 Access 中点击保存时出现以下错误:“表达式 Iif(isActiveDuty([EndDate]), True, False) 不能在计算列中使用。”
    • 这可能是对的。我从不使用计算列,它们只是针对超级用户的(太)“智能”功能。将表格保留为干净的列/字段,并为此创建一个 查询
    猜你喜欢
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多