NSPredicate синтаксис для DATEADD? - PullRequest
4 голосов
/ 13 ноября 2010

Есть ли способ сделать функцию DateAdd или DateDiff для NSPredicate?Спасибо, Хосе.

1 Ответ

6 голосов
/ 13 ноября 2010

На самом деле, есть! Это окольный способ сделать это, потому что 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, который некоторое количество секунд от контрольной точки во времени (например, 1 Jan 1970 или любой другой). К этому числу мы добавляем или вычитаем наш интервал, а затем приводим новый номер обратно к NSDate. Затем мы можем использовать обычный оператор сравнения для сравнения нашей новой даты с нашей датой сравнения.

Есть несколько вариантов этой идеи, но все они требуют приведения числа NSDate к числу (или числа к NSDate), чтобы получить его временной интервал.

Коварный, а?

редактировать

Если Core Data жалуется на конструкцию предиката, попробуйте поменять местами:

NSDate * comparisonDate = ...;
NSTimeInterval interval = 86400;

NSPredicate * p = [NSPredicate predicateWithFormat:@"date < CAST(CAST(%@, 'NSNumber') - %f, 'NSDate')", comparisonDate, interval];

edit # 2

Гром, который похитил Преподобный: http://tumblr.com/xqorqjfrz

...