2010-11-13 23 views
4

Y at-il un moyen de faire un DateAdd ou une fonction DateDiff sur un NSPredicate? Merci, Jose.Syntaxe NSPredicate pour DATEADD?

+1

+1, mais l'homme et moi allions faire un blo Merci de m'avoir volé mon tonnerre: P;) –

Répondre

6

En fait, il y en a! C'est une façon détournée de le faire, parce que NSPredicate ne le supporte pas directement (c.-à-d., Vous ne pouvez pas simplement + anInterval à NSDate). Heureusement, vous pouvez le faire, et heureusement pour vous, je l'ai juste compris il y a environ 2 jours.

Pour clarifier: Je suppose que vous demandez quelque chose comme: "un objet a une propriété date.Je veux voir si cette propriété date est un certain intervalle arbitraire avant/après une autre date". Si c'est ce que tu veux dire, alors oui tu peux le faire. Si ce n'est pas ce que vous voulez dire, veuillez clarifier votre question.

Nous y voilà. Dans cet exemple, nous allons supposer que l'objet par rapport auquel nous allons évaluer ce prédicat possède une propriété appelée date qui renvoie un NSDate. Nous allons voir si cette date est au moins 1 jour avant une autre date. Il y a deux manières différentes que nous pourrions faire cette comparaison:

date + 1 day is before comparisonDate 
date is before comparisonDate - 1 day 

Je vais aller avec la première approche:

NSDate * comparisonDate = ...; //an arbitrary NSDate object, against which we're going to be doing our comparison 
NSTimeInterval interval = 86400; //the number of seconds you want add or subtract. 

NSPredicate * p = [NSPredicate predicateWithFormat:@"CAST(CAST(date, 'NSNumber') + %f, 'NSDate') < %@", interval, comparisonDate]; 

Qu'est-ce qui se passe:

Pour obtenir ce travail , nous pouvons CAST() un objet de date à un NSNumber. Cela va convertir le NSDate en un NSNumber qui est un certain nombre de secondes à partir d'un point de référence dans le temps (comme le 1er janvier 1970 ou autre). À ce nombre, nous ajoutons ou soustrayons notre intervalle, puis nous renvoyons le nouveau numéro à NSDate. Ensuite, nous pouvons utiliser un opérateur de comparaison régulier pour comparer notre nouvelle date par rapport à notre date de comparaison.

Il existe plusieurs variantes de cette idée, mais elles nécessitent toutes de composer un NSDate en nombre (ou en attribuant un numéro à NSDate) pour obtenir son intervalle de temps.

Devious, hein?

modifier

Si Core Data se plaint de la construction du prédicat, essayez d'inverser les choses:

NSDate * comparisonDate = ...; 
NSTimeInterval interval = 86400; 

NSPredicate * p = [NSPredicate predicateWithFormat:@"date < CAST(CAST(%@, 'NSNumber') - %f, 'NSDate')", comparisonDate, interval]; 

modifier # 2

Le tonnerre Le révérend volé: http://tumblr.com/xqorqjfrz

+0

Dave merci beaucoup, et n'annulez pas le blog sur mon compte .. Je suis curieux de savoir comment vous avez trouvé cette solution ? –

+0

Malheureusement, cela ne fonctionnait pas pour coredata, lors de la définition du prédicat à l'entité, j'obtiens une exception "fonction non supportée" ... –

+0

@the Révérend: réponse éditée –