Objective-C中的领域日期范围查询

Posted

技术标签:

【中文标题】Objective-C中的领域日期范围查询【英文标题】:Realm date range query in Objective-C 【发布时间】:2015-11-21 22:31:21 【问题描述】:

我正在使用 Realm,并且我有一个按日期排序的数组,用于特定卡片的所有条目。我需要创建一个 NSPredicate (或其他方式),它将为我提供该卡的所有日期,以便为特定月份。我的问题是有些月份的天数不同。

这是我目前所拥有的。

// Filter specific card, create date and string for x axis
NSString *filteredName = [NSString stringWithFormat:@"%@", self.cardType];
NSDate *dateElement = [[NSDate alloc]init];
NSString *datedString = [[NSString alloc]initWithFormat:@""];

//Formatting datedString
NSDateFormatter *df = [[NSDateFormatter alloc] init];
df.dateFormat = @"MM/dd/YYYY";

NSSortDescriptor *dateSort = [[NSSortDescriptor alloc]initWithKey:@"date" ascending:YES];
NSArray *sortedArray = @[dateSort];

//self.orderHistory is all of the cards from the Realm database filtered down to a specific type of card.
for (Order *uniqueOrder in [self.orderHistory objectsWhere:@"name = [c] %@", filteredName]) 
    // [self.uniqueCardArray addObject:uniqueOrder];
    dateElement = uniqueOrder.date;
    datedString = [df stringFromDate:dateElement];
    [self.uniqueDatesForCardArray addObject:datedString];


[self.uniqueCardArray sortUsingDescriptor:sortedArray];

上面的代码给了我一张特定卡片的所有日期,我需要给定月份的日期,所以我尝试了这个俗气的解决方案,但我认为至少可以说更优雅一些。

NSDate *todaysDate = [NSDate date];
NSTimeInterval secondsInMonth =- (60 * 60 * 24 * 365) / 12;
NSDate *dateOneMonthBack = [todaysDate dateByAddingTimeInterval:secondsInMonth];

NSPredicate *backDatesPred = [NSPredicate predicateWithFormat: @"date BETWEEN %@, %@", dateOneMonthBack, todaysDate];

除了它是讨厌的代码之外,它还会让我从当前日期回到一个月,而不仅仅是回到月初。一直在查看 Realm 文档、NSCalendar 的东西和 NSPredicate 指南,现在我的脑袋正在游动,试图计算所有可能出现问题的问题。任何建议或代码 sn-ps 都会有很大帮助。

【问题讨论】:

【参考方案1】:

我不确定我是否正确理解了你的问题,下面的代码是你想要的吗?

要确定上个月的日期,请将带有负月份的NSDateComponet 添加到日期。

Realm 支持BETWEEN 查询。所以你可以查询两天。

NSDate *todaysDate = [NSDate date];

NSDateComponents *comps = [NSDateComponents new];
comps.month = -1;

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *dateOneMonthBack = [calendar dateByAddingComponents:comps toDate:todaysDate options:kNilOptions];

RLMResults *filteredHistory = [self.orderHistory objectsWhere:@"name = [c] %@", filteredName];
RLMResults *rangedHistory = [filteredHistory objectsWhere:@"date BETWEEN %@, %@", dateOneMonthBack, todaysDate];

【讨论】:

这与我要找的很接近,但这段代码会像我提供的示例代码(虽然丑陋)一样延续到上个月。我正在寻找的是一种从今天的日期返回到本月初的方法。因此,可能是一天前、三天前、24 天前等,才能到达月初。很抱歉没有更清楚地澄清这一点。不过这会有所帮助。 所以你的问题是如何使用NSDateComponents,对吧?如果您想获得昨天:只需将comps.month = -1 更改为comps.day = -1。三天前:comps.day = -3,24 天前:comps.day = -24

以上是关于Objective-C中的领域日期范围查询的主要内容,如果未能解决你的问题,请参考以下文章

获取财政年度查询中的动态日期范围的逻辑

Mongodb:从 mongo shell 中的 ObjectId 执行日期范围查询

应用引擎数据存储中的可用性日期范围查询?

将 SQL 输入日期范围传递给 SHINY 中的查询

报告中的日期范围,由于查询而无法正常工作

DATEDIFF() 或 BETWEEN 用于 SQL 查询中的日期范围