Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSPredicate to filter only on "year" part of a date field

I have an entity with a date field and I would like to select the records for a given year. How to build a NSPredicate for the job? Didn't find anything about date functions (if any) in Core Data

thanks

like image 280
kindoblue Avatar asked Mar 19 '11 22:03

kindoblue


2 Answers

Eventually I did more or less as suggested by Wienke. To create the predicate that fetches the records for a certain year(s), I did like this:

- (NSPredicate*) predicateFromYear:(NSInteger)start span:(NSInteger)aSpan {
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *dc = [NSDateComponents new];

[dc setYear:start];

NSDate *startDate,*endDate;

startDate = [cal dateFromComponents:dc];
[dc setYear:aSpan];
endDate = [cal
           dateByAddingComponents:dc
           toDate:startDate
           options:0];

[dc release];
return [NSPredicate predicateWithFormat:
        @"date >= CAST(%f, \"NSDate\") AND date < CAST(%f, \"NSDate\")",
        [startDate timeIntervalSinceReferenceDate],
        [endDate timeIntervalSinceReferenceDate]];  }
like image 129
kindoblue Avatar answered Nov 12 '22 02:11

kindoblue


A possible method:

Step 1) See "Creating a Date from Components" from Apple's "Date and Time Programming Guide." Make an NSDate representing the beginning of the year, and an NSDate representing the end of the year.

Step 2) Then you could build a predicate that searches for objects with date attrs that are greater than the first date and less than the last date.

The predicate would look something like this:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@“(inceptionDate > %@) AND (inceptionDate < %@)”, dateBeginYear, dateEndYear];
like image 1
Wienke Avatar answered Nov 12 '22 02:11

Wienke