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
Post a Comment