在我的数据库中我有两列,即startDate和endDate,如果用户在UI中按下任何日期,如16July 2015那么它应该获取介于startDate和endDate之间的所有事件。
之前我写了一个用于获取凝视事件的谓词:
[NSPredicate predicateWithFormat:[NSString stringWithFormat:@"%@ >= %%@ AND %@ < %%@", @"startTime", @"endTime"], date, [date dateForNextDay]]
但如果给定日期不是事件的开始日期,则上述查询将无效。
实施例: 如果我的会议日期为7/13 - 7/16且给定日期为7/14,则会议事件应该能够使用谓词获取。我的旧查询仅适用于7月13日。它应该在给定日期获取该事件 - 7 / 13,7 / 14,7 / 15,7 / 16
答案 0 :(得分:1)
获取给定日期大于或等于或小于或等于给定日期的事件....
[NSPredicate predicateWithFormat:@"%@ >= startTime AND %@ <= endTime", date, date]
编辑... 使用简单对象对此进行测试即可确认其正常运行....
- (NSArray *)filterArray:(NSArray *)array forDate:(NSDate *)date {
NSPredicate *p = [NSPredicate predicateWithFormat:@"%@ >= startTime AND %@ <= 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 be 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 be empty %@", [self filterArray:events forDate:july15]);
}
- (NSDate *)dateFromString:(NSString *)string {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM/dd/yyyy"];
return [dateFormatter dateFromString:string];
}
上述情况不需要对午夜案件进行特殊处理,以便按照问题的建议(包括最后的结束时间)执行。
这将生成以下日志输出,您可以自行确认...
filtered using 9 should be 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 be empty ()
答案 1 :(得分:0)
我不明白为什么你有两个日期:date和dateForNextDay。
我认为你应该试试这个: [NSPredicate predicateWithFormat:@&#34; startTime&gt; =%@&amp;&amp; %@&lt; endTime&#34;,date,[date dateForNextDay]];
或者只是转换你的最后%@ 和 %% @ ,就像这样=&gt; @&#34;%@&gt; = %% @ AND %% @&lt; %@&#34;
编辑:顺便说一句,正如@danh所说,您可能只想使用日期,日期。
Edit2:好的,我的回答太快了,所有条件都是假的,而且danh再次正确;) @&#34; startTime&lt; =%@&amp;&amp; %@&lt; = endTime&#34;