2

我有一个表达式,它从一个字段(日期)中提取月份和日期,然后从另一个字段(DOB - 出生日期)中提取年份。

来自字段的示例数据:

日期:2003 年 1 月 2 日

出生日期:1953 年 1 月 15 日

一个表达式:

Cancel Date: DatePart("m",[Date]) & "/" & DatePart("d",[Date]) & "/" & (DatePart("yyyy",[DOB])+60)

将返回:2013 年 1 月 2 日

我的问题是:如果 DOB 发生在该年现有 DATE 周年之后,那么取消日期应该增加 1 年,所以上面的表达式应该返回 2014。我将如何去包含它并简化这个表达式?谢谢!

4

2 回答 2

2

我还没有测试过这个查询,所以它可能需要调整才能得到你想要的。这个想法是用来Format()简化m/d/部分。然后使用IIf()表达式来确定要添加多少年Year([DOB])

SELECT
    Format([Date], 'm/d/') & (Year([DOB])
        + IIf(DatePart('y', [DOB]) > DatePart('y', [Date]), 61, 60))
        AS [Cancel Date]
FROM YourTable;

该方法依赖于DatePart('y', ...),它为您提供“一年中的一天”。例如,DatePart("y", #2013-04-02#)返回 92。您可以使用此方法将一个日期的月/日部分与另一个日期的月/日部分进行比较……这是一种捷径,以避免单独检查月和日。

不幸的是,DatePart('y', ...)没有正确计算闰年。(见下面戈德的评论。)

于 2013-04-02T17:44:39.623 回答
2

我相信这就是你所追求的:

Cancel Date: DatePart("m", [Date]) & "/" & DatePart("d", [Date]) & "/" & (DatePart("yyyy", [DOB]) + IIf((DatePart("m", [DOB]) < DatePart("m", [Date])) Or (DatePart("m", [DOB]) = DatePart("m", [Date]) And DatePart("d", [DOB]) < DatePart("d", [Date])), 60, 61))

IIf()部分基本上说

If (Month([DOB]) < Month([Date]))
        Or (Month([DOB]) = Month([Date]) And Day([DOB]) < Day([Date])) Then
    add 60
Else
    add 61
End If
于 2013-04-02T17:52:31.523 回答