我有一个表达式,从一个字段(日期)中提取一个月和一个日期,然后从另一个字段(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年。我将如何包含并简化此表达式?谢谢!
答案 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