2013-01-17 24 views
24

C'è un modo per restituire una serie di record in OData specificando un filtro "Data maggiore di xxxxx" ... ma utilizzando una data che è stata precedentemente ottenuta da un feed OData?OData: data "Maggiore di" filtro

Caso di utilizzo: Fingere di voler creare una pagina Web che visualizzi un elenco degli ordini online completati più di recente. Questo è quello che sto puntando:

  1. Caricare la pagina
  2. Hit mio servizio OData in modo asincrono, restituendo gli ultimi 100 ordini (ordinamento per data discendente in modo che l'ordine più recentemente completato presenta prima)
  3. costruire il codice HTML della pagina utilizzando i dati OData
  4. Conservare la data MAX in una variabile globale (assomiglia a questo:/data (1.338.336 milioni) /)
  5. Hit il servizio OData su un intervallo di 30 secondi, ma questa volta specificare un filtro per restituire solo i record in cui la data dell'ordine è maggiore della precedente M Data AX. In questo caso:/Data (1338336000000)/
  6. Se vengono restituiti record, creare l'HTML per tali record e anteporre gli articoli agli elementi caricati in precedenza.

Dove mi trovo in difficoltà è nello specificare il filtro "maggiore di" della data. Per qualche motivo, i filtri data in OData non sembrano giocare molto bene con il formato data nativo di OData. Devo convertire la data originariamente ottenuta in un formato diverso che può essere utilizzato per il filtraggio?

voglio fare qualcosa di simile:

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

FYI: Sto usando V2

+0

non un collegamento valido amico mio! –

+1

@ Rachel Lo so ... Sto chiedendo la sintassi corretta per fare quello che mi serve. Il link effettivo è irrilevante. – lamarant

risposta

31

capito questo.

OData V2 out-of-the-box restituisce le date di SQL in formato di data JSON in questo modo:

/Date(1338282808000)/ 

Tuttavia, al fine di utilizzare una data come filtro all'interno di una chiamata OData, la data deve essere in formato EDM, cercando in questo modo:

2012-05-29T09:13:28 

quindi, avevo bisogno di ottenere la data dalla mia chiamata OData iniziale, quindi convertirlo nel formato EDM per l'uso nella mia successiva OData chiamate, che sembrano this:

/Services/v001.svc/Orders?$filter=close_dt gt DateTime'2012-05-29T09:13:28' 

ho finito per creare una funzione javascript che fa la switcharoo formattazione:

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' 
    } 

Un paio di note:

  • Il formato JSON non sembra registrare per fuso orario, quindi la data restituita non corrisponde alla data che vedo nel mio database. Quindi ho dovuto aggiungere del tempo manualmente per compensare (qualcuno per favore spiega questo).
  • Sto utilizzando il plug-in date.format.js che è possibile scaricare here per la formattazione della data e l'aggiunta di orario.
+0

la data originale è in UTC, quindi è sempre espressa in termini di fuso orario GMT. Pertanto, le operazioni di data locale in javascript analizzeranno implicitamente la data nel fuso orario, che è la fonte dell'errore. – FlavorScape

+0

Nel mio caso l'attrezzo ODate V2 basato su Olingo V2, il nome della funzione dovrebbe essere "datetime" anziché "DateTime". – wangf

0

Se si utilizza la logica datetime, è possibile eseguire lt o gt.

ad es. ... mydomain/Servizi/v001.svc/Ordini? $ = Filtro close_dt gt datetime'20141231'

+0

Non riesco a farlo funzionare senza trattini. –

Problemi correlati