OData: date" supérieure à " filtre
Existe-t-il un moyen de renvoyer une série d'enregistrements dans OData en spécifiant un filtre "Date supérieure à xxxxx"...mais en utilisant une Date qui a été précédemment obtenu former un flux OData?
Cas D'utilisation: prétendez que je veux créer une page web qui affiche une liste des commandes en ligne les plus récentes. C'est ce que je vise:
- charger la page
- a frappé mon service OData de manière asynchrone, renvoyant les 100 dernières commandes (ordre Par date décroissant de sorte que le la dernière commande terminée apparaît en premier)
- construisez le code HTML sur la page en utilisant les données OData
- stockez la date maximale dans une variable globale(ressemble à ceci: /Date (1338336000000)/)
- Appuyez sur le service OData sur un intervalle de 30 secondes, mais spécifiez cette fois un filtre pour ne renvoyer que les enregistrements dont la date de commande est supérieure à la date maximale précédente. Dans ce cas: / Date (1338336000000) /
- Si des enregistrements sont renvoyés, créez le code HTML pour ces enregistrements et ajoutez les éléments précédemment chargé éléments.
Où je me bats est en spécifiant la date" supérieure à " filtre. Pour une raison quelconque, les filtres de date dans OData ne semblent pas jouer très bien avec OData propre format de date natif. Dois-je convertir la date obtenue à l'origine dans un format différent pouvant être utilisé pour le filtrage?
Je veux faire quelque chose comme ceci:
[http://mydomain/Services/v001.svc/Orders?$filter=close_dt gt 1338336000000][1]
FYI: j'utilise V2
4 réponses
J'ai compris.
OData v2 out-of-the-box renvoie des dates de SQL au format de Date JSON comme ceci:
/Date(1338282808000)/
Cependant, pour utiliser une date comme filtre dans un appel OData, votre date doit être au format EDM, ressemblant à ceci:
2012-05-29T09:13:28
Donc, j'avais besoin d'obtenir la date de mon appel OData initial, puis de la convertir au format EDM pour l'utiliser dans mes appels OData suivants, qui ressemblent à ceci:
/Services/v001.svc/Orders?$filter=close_dt gt DateTime'2012-05-29T09:13:28'
J'ai fini par créer une fonction javascript qui fait le mise en forme switcharoo:
function convertJSONDate(jsonDate, returnFormat) {
var myDate = new Date(jsonDate.match(/\d+/)[0] * 1);
myDate.add(4).hours(); //using {date.format.js} to add time to compensate for timezone offset
return myDate.format(returnFormat); //using {date.format.js} plugin to format :: EDM FORMAT='yyyy-MM-ddTHH:mm:ss'
}
Quelques notes:
- le format JSON ne semble pas s'ajuster au fuseau horaire, donc la date retournée ne correspond pas à la date que je vois dans ma base de données. J'ai donc dû ajouter du temps manuellement pour compenser (quelqu'un explique cela).
- j'utilise la date .format.js plugin que vous pouvez télécharger ici pour formater la date et ajouter l'heure.
Dans le format de filtrage de date OData v4 a changé pour $filter=close_dt gt 2006-12-30T23:59:59.99Z
Par exemple
Pour les versions précédentes D'OData, voir les réponses précédentes
Juste un FYI: dans V3 du protocole, le format datetime Non-tick-based est maintenant le format par défaut:
..."ReleaseDate":"1992-01-01T00:00:00"...
Si vous utilisez la logique datetime, vous pouvez faire lt ou gt.
Par exemple. ...mondomaine/Services/v001.svc / ordres?$filtre=close_dt gt datetime'20141231'