2013-01-17 14 views
24

Czy istnieje sposób na zwrócenie serii rekordów w OData przez określenie filtru "Data większa niż xxxxx" ... ale przy użyciu daty wcześniej uzyskanej z kanału OData?Odata: Filtr "Większy niż data"

Przypadek użycia: Podaj, że chcę utworzyć stronę internetową, która wyświetla listę ostatnio wypełnionych zamówień online. To, co mam zmierzające do:

  1. załadować stronę
  2. Hit moją usługę OData asynchronicznie, wracając ostatnie 100 zamówień (kolejność według daty malejąco tak, że ostatnio zakończone zamówienie pojawia się pierwszy)
  3. Budowanie HTML na stronie przy użyciu danych OData
  4. Store data MAX do zmiennej globalnej (wygląda tak:/data (1338336000000) /)
  5. Hit usługę OData na 30 sekund przerwy, ale tym razem określić filtr zwracający tylko rekordy, w których data zamówienia jest większa niż poprzednie M Data AX. W takim przypadku:/Date (1338336000000)/
  6. Jeśli zostaną zwrócone jakiekolwiek rekordy, zbuduj kod HTML dla tych rekordów i dodaj elementy do wcześniej wczytanych elementów.

Tam, gdzie walczę, określam filtr "większy niż" Data. Z jakiegoś powodu daty filtrów w OData nie wydają się być bardzo miłe z oryginalnym formatem daty OData. Czy muszę przekonwertować pierwotnie uzyskaną datę na inny format, który może być używany do filtrowania?

chcę zrobić coś takiego:

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

FYI: Używam V2

+0

Nieprawidłowy link mój przyjaciel! –

+1

@Rachel Wiem ... Pytam o poprawną składnię, aby zrobić to, czego potrzebuję. Rzeczywisty link jest nieistotny. – lamarant

Odpowiedz

31

zdobione ten.

OData V2 out-of-the-box zwraca datę z SQL w JSON Data formacie tak:

/Date(1338282808000)/ 

Jednakże, w celu wykorzystania datę jako filtr w ramach wezwania OData, datę musi być w formacie EDM, patrząc tak:

2012-05-29T09:13:28 

Więc musiałem uzyskać datę z mojego pierwszego połączenia OData, a następnie konwertować je do formatu EDM do użytku w moim kolejnym OData wzywa, które wyglądają jak to:

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

skończyło się na tworzenie funkcji javascript, że robi to switcharoo formatowania:

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

Kilka uwag:

  • format JSON nie wydają się dopasować do strefy czasowej, więc data zwrócony nie pasuje do daty, którą widzę w mojej bazie danych. Musiałem więc dodać czas ręcznie, aby to zrekompensować (ktoś to wyjaśnić).
  • Używam wtyczki date.format.js, którą można pobrać here w celu sformatowania daty i dodania czasu.
+0

oryginalna data jest w UTC, więc zawsze jest wyrażona w terminach strefy czasowej GMT. Dlatego lokalne operacje na datach w javascript będą domyślnie analizować datę w strefie czasowej, która jest źródłem błędu. – FlavorScape

+0

W moim przypadku narzędzie ODate V2 oparte na Olingo V2, nazwa funkcji powinna być "datetime" zamiast "DateTime". – wangf

0

Jeśli używasz logiki datetime, możesz zrobić lt lub gt.

np. ... mydomain/Usługi/v001.svc/Zamówienia? $ Filter = close_dt gt datetime'20141231'

+0

Nie mogę tego uruchomić bez kresek. –