ios - NSPredicate for multiday-all day event -


in database have 2 columns i.e. startdate , enddate , if user pressed date in ui 16july 2015 should fetch events fall between startdate , enddate.

earlier wrote predicate fetching staring events:

[nspredicate predicatewithformat:[nsstring stringwithformat:@"%@ >= %%@ , %@ < %%@", @"starttime", @"endtime"], date, [date datefornextday]] 

but above query not work if given date not event's starting date.

example: if have conference date 7/13 - 7/16 , given date 7/14 conference event should able fetch using predicate. old query work on 7/13. should fetch event on given dates - 7/13, 7/14, 7/15, 7/16

fetch events given date greater or equal , less or equal given date....

[nspredicate predicatewithformat:@"%@ >= starttime , %@ <= endtime", date, date] 

edit... testing simple object confirms works correctly....

- (nsarray *)filterarray:(nsarray *)array fordate:(nsdate *)date {     nspredicate *p = [nspredicate predicatewithformat:@"%@ >= starttime , %@ <= endtime", date, date];     return [array filteredarrayusingpredicate:p]; }  - (void)testpredicate {      nsdictionary *event0 = @{ @"starttime":[self datefromstring:@"07/01/2015"], @"endtime":[self datefromstring:@"07/04/2015"] };     nsdictionary *event1 = @{ @"starttime":[self datefromstring:@"07/10/2015"], @"endtime":[self datefromstring:@"07/14/2015"] };     nsdictionary *event2 = @{ @"starttime":[self datefromstring:@"08/02/2015"], @"endtime":[self datefromstring:@"08/09/2015"] };      nsarray *events = @[event0, event1, event2];      nsdate *july9 = [self datefromstring:@"07/09/2015"];     nsdate *july10 = [self datefromstring:@"07/10/2015"];     nsdate *july11 = [self datefromstring:@"07/11/2015"];     nsdate *july13 = [self datefromstring:@"07/13/2015"];     nsdate *july14 = [self datefromstring:@"07/14/2015"];     nsdate *july15 = [self datefromstring:@"07/15/2015"];      nslog(@"filtered using 9 should empty %@", [self filterarray:events fordate:july9]);     nslog(@"filtered using 10 should hit %@", [self filterarray:events fordate:july10]);     nslog(@"filtered using 11 should hit %@", [self filterarray:events fordate:july11]);     nslog(@"filtered using 13 should hit %@", [self filterarray:events fordate:july13]);     nslog(@"filtered using 14 should hit %@", [self filterarray:events fordate:july14]);     nslog(@"filtered using 15 should empty %@", [self filterarray:events fordate:july15]); }  - (nsdate *)datefromstring:(nsstring *)string {     nsdateformatter *dateformatter = [[nsdateformatter alloc] init];     [dateformatter setdateformat:@"mm/dd/yyyy"];     return [dateformatter datefromstring:string]; } 

the foregoing doesn't require special handling midnight case in order perform question suggests (inclusive of last endtime).

this generates following log output can confirm yourself...

filtered using 9 should empty () filtered using 10 should hit (         {         endtime = "2015-07-14 07:00:00 +0000";         starttime = "2015-07-10 07:00:00 +0000";     } ) filtered using 11 should hit (         {         endtime = "2015-07-14 07:00:00 +0000";         starttime = "2015-07-10 07:00:00 +0000";     } ) filtered using 13 should hit (         {         endtime = "2015-07-14 07:00:00 +0000";         starttime = "2015-07-10 07:00:00 +0000";     } ) filtered using 14 should hit (         {         endtime = "2015-07-14 07:00:00 +0000";         starttime = "2015-07-10 07:00:00 +0000";     } ) filtered using 15 should empty () 

Comments