如何更改访问邮件合并源?

时间:2013-04-02 17:21:45

标签: ms-access

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

来自字段的示例数据:

日期:1/2/2003

DOB:1953年1月15日

表达:

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

将返回:1/2/2013

我的问题是:如果DOB发生在该年度现有的DATE周年纪念日之后,则取消日期应该增加1年,因此上面的表达式应该返回2014年。我将如何包含并简化此表达式?谢谢!

2 个答案:

答案 0 :(得分: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', ...)没有正确计算闰年。 (见下面的Gord的评论。)

答案 1 :(得分: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