使用核心数据获取两个日期之间的记录 ios swift

Fetch records between two dates using core data ios swift

我正在尝试搜索 swift 中两个日期之间的记录。 我正在存储日期,如下所示:

     let date = NSDate()
     let dateFormatter = NSDateFormatter()
     dateFormatter.dateFormat = "yyyy'-'MM'-'dd HH':'mm':'ss"

     println(date) // prints 2015-09-26 05:22:41 +0000

     myreport.setValue(date, forKey: "date")

下面是我使用 NSPredicate 获取两个日期之间的记录的代码:

    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"

    let startDate:NSDate = dateFormatter.dateFromString(fromdate)!
    let endDate:NSDate = dateFormatter.dateFromString(todate)!

    println(fromdate) // prints 2015-09-22
    println(todate)  // prints 2015-09-29
    println(startDate) // prints 2015-09-21 20:00:00 +0000
    println(endDate)  // prints 2015-09-28 20:00:00 +0000
    let predicate1 = NSPredicate(format: "%@ >= date AND %@ <= date", argumentArray: [startDate, endDate])

    let predicate = NSCompoundPredicate(type: NSCompoundPredicateType.OrPredicateType, subpredicates: [predicate1])
    // Set the predicate on the fetch request
    request.predicate = predicate
    request.sortDescriptors = [NSSortDescriptor(key: "report_id", ascending: false)]
    var results : NSArray = context.executeFetchRequest(request, error: nil)!

注:

1) 我的开始日期和今天的格式为 2015-09-25(作为字符串)

2) 我在核心数据中日期属性的数据类型是 NSDate

3) 我能够成功地从核心数据中存储和获取日期

当我 运行 上面的代码时,我没有收到任何错误,但代码没有搜索两个日期之间的记录。我的意思是我得到的是空结果数组。

任何人都可以告诉我我在这里做错了什么。 另外请让我知道是否需要更多信息。提前致谢!

我认为您的谓词可能有误,请尝试修改为: %@ <= date AND date <= %@

通过这种方式,您将看到 date 介于开始日期和结束日期之间。

经过多次修改和测试后,终于对我有用了,如下所示。如果您需要我如何将 nsdate 存储在 coredata 中,请检查上面的问题。

    println(self.appdel.fromdate) // prints 2015-09-25
    println(self.appdel.todate) // prints 2015-09-26

    var fromdate = "\(self.appdel.fromdate) 00:00" // add hours and mins to fromdate 
    var todate = "\(self.appdel.todate) 23:59" // add hours and mins to todate

    var context : NSManagedObjectContext = appdel.managedObjectContext!
    var request = NSFetchRequest(entityName: "TblReportsP")
    request.returnsObjectsAsFaults = false
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm"
    dateFormatter.timeZone = NSTimeZone(name: "GMT") // this line resolved me the issue of getting one day less than the selected date
    let startDate:NSDate = dateFormatter.dateFromString(fromdate)!
    let endDate:NSDate = dateFormatter.dateFromString(todate)!
    request.predicate = NSPredicate(format: "(date >= %@) AND (date <= %@)", startDate, endDate)

    request.sortDescriptors = [NSSortDescriptor(key: "report_id", ascending: false)]
    var results : NSArray = context.executeFetchRequest(request, error: nil)!

    println(results.count)