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:

  1. charger la page
  2. 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)
  3. construisez le code HTML sur la page en utilisant les données OData
  4. stockez la date maximale dans une variable globale(ressemble à ceci: /Date (1338336000000)/)
  5. 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) /
  6. 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

25
demandé sur lamarant 2013-01-18 00:36:45

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.
33
répondu lamarant 2013-01-18 19:07:31

Dans le format de filtrage de date OData v4 a changé pour $filter=close_dt gt 2006-12-30T23:59:59.99Z

Par exemple

Http://services.odata.org/V4/OData/OData.svc/Products?$filter=ReleaseDate%20gt%202006-12-30T23:59:59.99 Z

Pour les versions précédentes D'OData, voir les réponses précédentes

16
répondu avitenberg 2015-07-07 19:24:32

Juste un FYI: dans V3 du protocole, le format datetime Non-tick-based est maintenant le format par défaut:

Http://services.odata.org/Experimental/OData/OData.svc/Products%280%29?$format=application/json;odata=verbose&$select=ReleaseDate

..."ReleaseDate":"1992-01-01T00:00:00"...

2
répondu Matt Meehan 2013-02-05 21:44:05

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'

0
répondu Cote Adams 2014-05-23 21:45:08