MS Access贷款重定价日期计算公式语法错误修正请求
MS Access 更新查询重定价日期公式修正
尝试通过MS Access更新查询计算贷款重定价日期(贷款每5年重置一次,无之前重置日期信息),但原公式存在语法错误,无法得到正确的最小日期。
原错误公式
IIf((GetReportingDate()-[Final_Data]![Start Date])>(365*5*4), MIN([Final_Data]![Maturity Date] ,(DateAdd(“YYYY”,25, [Final_Data]![Start Date])), IIf((GetReportingDate()-[Final_Data]![Start Date])>(365*5*3), MIN([Final_Data]![Maturity Date] ,(DateAdd(“YYYY”,20, [Final_Data]![Start Date])), IIf((GetReportingDate()-[Final_Data]![Start Date])>(365*5*2), MIN([Final_Data]![Maturity Date] ,(Dateadd(“YYYY”,15, [Final_Data]![Start Date])), IIf((GetReportingDate()-[Final_Data]![Start Date])>(365*5), MIN([Final_Data]![Maturity Date],(Dateadd(“YYYY”,10, [Final_Data]![Start Date])), IIf(([Final_Data]![Start Date]+365*5)<[Final_Data]![Maturity Date], MIN([Final_Data]![Maturity Date], (Dateadd(“YYYY”,5, [Final_Data]![Start Date])),[Final_Data]![Maturity Date]))))), "Check")))
需求规则
- 若贷款起始日距报告日超过20年,取Min(起始日+25年,贷款到期日)
- 若贷款起始日距报告日超过15年,取Min(起始日+20年,贷款到期日)
- 若贷款起始日距报告日超过10年,取Min(起始日+15年,贷款到期日)
- 若贷款起始日距报告日超过5年,取Min(起始日+10年,贷款到期日)
- 若贷款起始日距报告日不足5年,取Min(起始日+5年,贷款到期日)
- 若以上条件均不满足,重定价日期=到期日
修正后的公式及说明
错误点分析
- 中文引号误用:公式中使用了中文双引号
“”,需替换为英文双引号"" - MIN函数使用错误:Access中
MIN()是聚合函数,单条记录取较小值应使用IIf(a < b, a, b) - 括号不匹配:原公式嵌套
IIf的括号数量混乱,导致语法错误 - 日期计算不准确:用
365*N计算年份忽略闰年,应使用DateDiff("yyyy", [Start Date], GetReportingDate()) - 逻辑冗余:最后一个
IIf条件多余,直接按规则覆盖即可
修正后嵌套IIf公式
IIf(DateDiff("yyyy", [Final_Data]![Start Date], GetReportingDate()) > 20, IIf(DateAdd("yyyy",25,[Final_Data]![Start Date]) < [Final_Data]![Maturity Date], DateAdd("yyyy",25,[Final_Data]![Start Date]), [Final_Data]![Maturity Date]), IIf(DateDiff("yyyy", [Final_Data]![Start Date], GetReportingDate()) > 15, IIf(DateAdd("yyyy",20,[Final_Data]![Start Date]) < [Final_Data]![Maturity Date], DateAdd("yyyy",20,[Final_Data]![Start Date]), [Final_Data]![Maturity Date]), IIf(DateDiff("yyyy", [Final_Data]![Start Date], GetReportingDate()) > 10, IIf(DateAdd("yyyy",15,[Final_Data]![Start Date]) < [Final_Data]![Maturity Date], DateAdd("yyyy",15,[Final_Data]![Start Date]), [Final_Data]![Maturity Date]), IIf(DateDiff("yyyy", [Final_Data]![Start Date], GetReportingDate()) > 5, IIf(DateAdd("yyyy",10,[Final_Data]![Start Date]) < [Final_Data]![Maturity Date], DateAdd("yyyy",10,[Final_Data]![Start Date]), [Final_Data]![Maturity Date]), IIf(DateAdd("yyyy",5,[Final_Data]![Start Date]) < [Final_Data]![Maturity Date], DateAdd("yyyy",5,[Final_Data]![Start Date]), [Final_Data]![Maturity Date]) ) ) ) )
简化版(使用Switch函数更易读)
Access支持Switch()函数,逻辑更清晰直观:
Switch( DateDiff("yyyy", [Final_Data]![Start Date], GetReportingDate()) > 20, IIf(DateAdd("yyyy",25,[Final_Data]![Start Date]) < [Final_Data]![Maturity Date], DateAdd("yyyy",25,[Final_Data]![Start Date]), [Final_Data]![Maturity Date]), DateDiff("yyyy", [Final_Data]![Start Date], GetReportingDate()) > 15, IIf(DateAdd("yyyy",20,[Final_Data]![Start Date]) < [Final_Data]![Maturity Date], DateAdd("yyyy",20,[Final_Data]![Start Date]), [Final_Data]![Maturity Date]), DateDiff("yyyy", [Final_Data]![Start Date], GetReportingDate()) > 10, IIf(DateAdd("yyyy",15,[Final_Data]![Start Date]) < [Final_Data]![Maturity Date], DateAdd("yyyy",15,[Final_Data]![Start Date]), [Final_Data]![Maturity Date]), DateDiff("yyyy", [Final_Data]![Start Date], GetReportingDate()) > 5, IIf(DateAdd("yyyy",10,[Final_Data]![Start Date]) < [Final_Data]![Maturity Date], DateAdd("yyyy",10,[Final_Data]![Start Date]), [Final_Data]![Maturity Date]), True, IIf(DateAdd("yyyy",5,[Final_Data]![Start Date]) < [Final_Data]![Maturity Date], DateAdd("yyyy",5,[Final_Data]![Start Date]), [Final_Data]![Maturity Date]) )
内容的提问来源于stack exchange,提问作者Phani Prasad
相关产品推荐
相关产品推荐

