2017-02-22 2 views
0

У меня есть приложение, которое имеет несколько записей времени с датой, сохраненной как NSDate.Фильтр fetchRequest для года/месяца с использованием NSPredicate

Я хотел бы использовать запрос на выборку для фильтрации в течение определенного года и месяца, которые я получаю из другого места. Как я могу использовать NSPredicate для фильтрации в течение года и месяца?

let predicate = NSPredicate(format: "%K == %D && %K == %D", ???, selectedMonth, ???, selectedYear) 

Update

Используя помощь Рака указала, я придумал следующий код:

var dateComp = DateComponents() 
dateComp.year = Int(selectedYear) 
dateComp.month = Int(selectedMonth) 
dateComp.day = 1 

let calendar = Calendar.current 
let firstDayOfTheMonth = calendar.date(from: dateComp) 

var oneMonth = DateComponents() 
oneMonth.month = 1 
let beginningOfNextMonth = calendar.date(byAdding: oneMonth, to: firstDayOfTheMonth!) 

И предикат:

let predicate = NSPredicate(format: "date >= %@ AND date < %@", firstDayOfTheMonth as! CVarArg, beginningOfNextMonth as! CVarArg) 

Я получаю SIGABRT со следующим сообщением:

Could not cast value of type 'Foundation.Date' (0x1073a0ae0) to 'Swift.CVarArg' (0x1196851c8). 

Xcode предложил добавить «как! CVarArg»

Update 2

Следующий предикат работал в настоящее время:

let predicate = NSPredicate(format: "%K >= %@ && %K < %@", "date", firstDayOfTheMonth! as NSDate, "date", beginningOfNextMonth! as NSDate) 
+0

Какой формат даты вы сохраняете? – raki

+0

Я использую NSDate. В CoreData введите «Дата». – sidetrax

+0

это может помочь: http://stackoverflow.com/questions/13262567/how-to-build-a-nspredicate-filtering-all-days-in-a-month-using-nsdate – raki

ответ

0

Вы не можете предикат, как это, но вы можете создать два Dates от Вашего месяца и года, которые начинают день месяца и конец дня месяца.

Теперь вам нужно просто предицировать таким образом.

let predicate = NSPredicate(format: "%K >= %@ && %K <= %@", "DateAttribute", startDateOfMonth as NSDate, "DateAttribute", endDateOfMonth as NSDate) 

Edit: Если вы не знаете, как создать дату startDateOfMonth и endDateOfMonth, то вы можете создать его, используя DateComponents.

let selectedMonth = 11 
let selectedYear = 2015 
var components = DateComponents() 
components.month = selectedMonth 
components.year = selectedYear 
let startDateOfMonth = Calendar.current.date(from: components) 

//Now create endDateOfMonth using startDateOfMonth 
components.year = 0 
components.month = 1 
components.day = -1 
let endDateOfMonth = Calendar.current.date(byAdding: components, to: startDate!) 
+0

Спасибо за помощь. Я просто создал его сам, пока вы печатали ...: P Но мне нравятся components.day = -1. Не знал этого. – sidetrax

+0

@ user7259583 Работает ли сейчас, вы получаете желаемый результат? –

+0

@ user7259583 Проверьте отредактированный ответ и предикат типа «Дата» на 'NSDate'. как 'startDateOfMonth как NSDate' –

Смежные вопросы