2013-04-24 8 views
8

Мне нужно вернуть записи, которые имеют дату 4/4/2013 (например). Поле даты в службе ODATA возвращается как {DATE: "2013-04-04T17: 39: 33.663"}ODATA DATE QUERY

Как должен выглядеть запрос?

До сих пор я видел три варианта для этого, но ни один из них не является прямым.

Вариант один: datetime'2013-04-04T12: 00' : это требует уточнения времени

Вариант два: месяц (ДАТА) эк 04 день (ДАТА) эк 04 год (ДАТА) эк 2013: это является громоздким

Вариант третий: с использованием опции one с 'ge' и 'le' для получения записей между 2 датами: это тоже дерьмо.

Это должно быть очень просто, как в T-SQL.

ответ

12

OData v3 не имеет примитивного типа данных, это всего лишь Date. У вас есть либо DateTime, либо DateTimeOffset, поэтому, независимо от того, используете вы его или нет, есть временная часть этого значения, и если вы хотите проверить значение для равенства, необходимо проверить компонент времени также.

Если вы точно знаете, что вы никогда не использовать временную часть (и всегда установить его до 00:00), вы могли сделать следующий запрос:

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

который подразумевает временную часть 00 : 00. Но это только сокращение. И вы можете иметь неожиданные результаты, если некоторые из ваших DateTimes заканчиваются временными порциями, которые не являются 00:00.

Таким образом, учитывая, что вы просто хотите, чтобы проверить дату часть стоимости, а не полное равенство, я думаю, что второй подход вы упоминаете это лучший способ сделать это:

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

Таким образом, вы точно проверяете, что вы хотите проверить, и ничего больше.

Для чего это стоит, я считаю, что в OData v4 находится тип данных Date. Тогда вы сможете использовать проверку равенства, не беспокоясь о времени.

+0

Первая часть не работает для меня в oData V3 – Matt

2

Кроме того, я хочу сказать, что вы также можете использовать LINQPAD для запросов OData поколения. Вы должны сделать запрос LINQ, а LINQPAD будет генерировать правильный URI. Например:

  • Linq:

из эв События , где ev.Start> = DateTime.Now.Date выберите эв

  • LINQPad генерирует OData URI:

    http://yoursite/_vti_bin/listdata.svc/Events()?$filter=Start ge datetime'2013-12-05T00:00:00+01:00'
  • Настройте его на c orrect. В моем случае я удаляю «+01: 00».

Также вы можете использовать Visual studio для получения запроса Odata.