有没有办法在NSPredicate上执行DateAdd或DateDiff函数? 谢谢, 何。
答案 0 :(得分:6)
实际上,有!这是一种迂回的方式,因为NSPredicate
不直接支持它(即,你不能只+ anInterval
到NSDate
)。幸运的是,你可以做到,幸运的是,我只是在2天前弄明白了。
澄清一下:我假设你要求的东西是:“一个对象有一个date
属性。我想看看这个date
属性是否是在另一个之前/之后的任意间隔日期”。如果这就是你的意思,那么是的,你可以做到。如果这不是您的意思,那么请澄清您的问题。
我们走了。在这个例子中,我们将假设我们将评估此谓词的对象具有一个名为date
的属性,该属性返回NSDate
。我们将在另一个日期之前查看此日期是否至少1天。我们可以通过几种不同的方式进行比较:
date + 1 day is before comparisonDate
date is before comparisonDate - 1 day
我将采用第一种方法:
NSDate * comparisonDate = ...; //an arbitrary NSDate object, against which we're going to be doing our comparison
NSTimeInterval interval = 86400; //the number of seconds you want add or subtract.
NSPredicate * p = [NSPredicate predicateWithFormat:@"CAST(CAST(date, 'NSNumber') + %f, 'NSDate') < %@", interval, comparisonDate];
发生了什么:
为了实现这一点,我们可以CAST()
NSNumber
的日期对象。这将把NSDate
转换为NSNumber
,这是参考时间点(例如1970年1月1日或其他任何时间)的一些秒数。对于该数字,我们添加或减去我们的间隔,然后将新数字转换回NSDate
。然后我们可以使用常规比较运算符将我们的新日期与比较日期进行比较。
这个想法有几种不同的变体,但它们都需要将NSDate
转换为数字(或将数字转换为NSDate
)以获得其时间间隔。
狡猾,嗯?
修改强>
如果Core Data抱怨谓词的构造,请尝试颠倒事物:
NSDate * comparisonDate = ...;
NSTimeInterval interval = 86400;
NSPredicate * p = [NSPredicate predicateWithFormat:@"date < CAST(CAST(%@, 'NSNumber') - %f, 'NSDate')", comparisonDate, interval];
编辑#2
The Reverend偷走的雷声:http://tumblr.com/xqorqjfrz