2013-04-24 11 views
8

Potrzebuję zwrócić rekordy, które mają datę 4/4/2013 (na przykład). Pole daty w usłudze ODATA zwraca jako {DATA: "2013-04-04T17: 39: 33.663"}ODATA DATA QUERY

Jak powinno wyglądać zapytanie?

Do tej pory widziałem trzy opcje, aby to zrobić, ale żadna z nich nie jest prosta.

Opcja pierwsza: datetime'2013-04-04T12: 00' : to wymaga określenia czasu

Opcja druga: miesiąc (data) eq 04 dni (data) eq 04 lat (data) eq 2013: ten jest uciążliwe:

Opcja trzecia: użycie opcji pierwszej z "ge" i "le" w celu uzyskania danych między 2 datami: jest to również bzdura.

Powinno to być bardzo proste, ponieważ jest w języku T-SQL.

Odpowiedz

12

OData v3 nie ma pierwotnego typu danych, który jest tylko Date. Posiadana właściwość to DateTime lub DateTimeOffset, więc niezależnie od tego, czy jej używasz, czy nie, część czasu tej wartości i jeśli chcesz sprawdzić wartość równości, składnik czasu musi być sprawdzony także.

Jeśli wiesz na pewno, że nigdy nie używać część czasu (i zawsze ustawić ją do 00:00), to mógł wykonać następujące zapytanie:

/service.svc/EntitySet?$filter=DateProperty+eq+datetime'2013-04-04' 

co oznacza część czasu 00 : 00. Ale to tylko skrót. Możesz też uzyskać nieoczekiwane rezultaty, jeśli niektóre z Twoich dat zostaną zakończone porcjami, które nie są 00:00.

więc, biorąc pod uwagę, że po prostu chcesz sprawdzić datę część wartości, a nie pełnej równości, myślę, że drugie podejście wspomnieć jest najlepszym sposobem będzie o nim:

/service.svc/EntitySet?$filter=day(DateProperty)+eq+4+and+month(DateProperty)+eq+4+and+year(DateProperty)+eq+2013 

ten sposób dokładnie sprawdzasz, co masz zamiar sprawdzać i nic więcej.

Co jest warte, Wierzę, że typ danych Date nadchodzi w OData v4. Wtedy będziesz mógł używać sprawdzania równości bez martwienia się o czas.

+0

Pierwsza część nie działa dla mnie w oData V3 – Matt

2

Ponadto chcę powiedzieć, że można również użyć LINQPAD do generowania żądań OData. Powinieneś złożyć żądanie LINQ, a LINQPAD wygeneruje poprawny URI. Np

  • Linq:

z eV zdarzeń gdzie ev.Start> = DateTime.Now.Date wybrać ev

  • LINQPad generuje OData URI:

    http://yoursite/_vti_bin/listdata.svc/Events()?$filter=Start ge datetime'2013-12-05T00:00:00+01:00'
  • Dopasuj do c orrect format. W moim przypadku usuwam "+01: 00".

Możesz również użyć Visual Studio, aby uzyskać żądanie Odata.