NAPredicate DATEADD的语法?

时间:2010-11-13 04:36:27

标签: cocoa core-data nspredicate

有没有办法在NSPredicate上执行DateAdd或DateDiff函数? 谢谢, 何。

1 个答案:

答案 0 :(得分:6)

实际上,有!这是一种迂回的方式,因为NSPredicate不直接支持它(即,你不能只+ anIntervalNSDate)。幸运的是,你可以做到,幸运的是,我只是在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