使用 NSPredicate 在 NSDate 之间进行过滤

Filter Between NSDates with NSPredicate

我的核心数据模型的简化版本如下所示 我正在尝试过滤一组满足以下条件 "type"== "DIVIDEND_TYPE" 且 "date" 介于 "startDate" 和 "endDate" 之间的资产。

我的谓词看起来像这样

 NSPredicate *myPredicate = [NSPredicate predicateWithFormat:
                                @"ANY transactions.type == %@ AND ANY transactions.date >= %@ AND ANY transactions.date <= %@", DIVIDEND_TYPE, startDate, endDate];

NSSet *filteredSet = [self.portfolio.assets filteredSetUsingPredicate:myPredicate];

这个谓词似乎尊重开始日期和类型,但不尊重结束日期。 filteredSet 始终包括包含日期超过 endDate 的交易的资产。

我做错了什么?

每个 ANY 子句的条件都得到独立测试,因此如果 Asset 有任何正确类型的交易,以及日期在 startDate 之后的任何交易,等等 - 但它可能是不同的交易满足每个测试。请改用 SUBQUERY:它允许您测试每个事务的多个属性:

NSPredicate *myPredicate = [NSPredicate predicateWithFormat:@"SUBQUERY(transactions, $T, $T.type == %@ AND $T.date >= %@ AND $T.date <= %@).@count > 0", DIVIDEND_TYPE, startDate, endDate];