web-dev-qa-db-fra.com

Filtre OData: Date "Supérieur à"

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 précédemment obtenue à partir d'un flux OData?

Cas d'utilisation: / Imaginez que je souhaite créer une page Web affichant la liste des dernières commandes en ligne terminées. C'est ce que je vise:

  1. Charger la page
  2. Appuyez sur mon service OData de manière asynchrone, en retournant les 100 dernières commandes (ordre décroissant par date, de sorte que la dernière commande terminée apparaisse en premier)
  3. Construire le code HTML sur la page en utilisant les données OData
  4. Stocker la date MAX dans une variable globale (qui ressemble à ceci:/Date (1338336000000) /)
  5. Appuyez sur le service OData toutes les 30 secondes, mais spécifiez un filtre pour ne renvoyer que les enregistrements dont la date de commande est supérieure à la date MAX 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 aux éléments précédemment chargés.

Là où je me bats, c’est de spécifier le filtre Date "supérieur à". Pour une raison quelconque, les filtres de date dans OData ne semblent pas jouer très bien avec le format de date natif d'OData. 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 ça:

[http://mydomain/Services/v001.svc/Orders?$filter=close_dt gt 1338336000000][1]

FYI: J'utilise V2

29
lamarant

Compris ça.

OData V2 out-of-the-box retourne les dates hors SQL au format de date JSON comme suit:

/Date(1338282808000)/

Cependant, pour utiliser une date en tant que filtre dans un appel OData, votre date doit être au format EDM, ressemblant à ceci:

2012-05-29T09:13:28

Je devais donc obtenir la date de mon appel OData initial, puis le 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 effectue le formatage:

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'adapter au fuseau horaire. La date renvoyée ne correspond donc pas à la date indiquée dans ma base de données. J'ai donc dû ajouter du temps manuellement pour compenser (veuillez expliquer ceci).
  • J'utilise le plugin date.format.js que vous pouvez télécharger ici pour formater la date et ajouter une heure.
35
lamarant

Dans OData V4, le format de filtrage de la date a été remplacé par $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-3023:59:59.99Z

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

23
avitenberg

Juste un FYI: dans la V3 du protocole, le format de date/heure non basé sur les ticks 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
Matt Meehan

Si vous utilisez la logique datetime, vous pouvez utiliser lt ou gt. 

par exemple. ... mydomain/Services/v001.svc/Orders? $ filter = close_dt gt datetime'20141231 '

0
Cote Adams