OData: фильтр даты "Больше, чем"
Есть ли способ вернуть серию записей в OData, указав фильтр "Дата больше, чем xxxxx"... но используя ранее полученную дату с помощью фида OData?
Случай использования: Представьте, что я хочу создать веб-страницу, на которой отображается список последних завершенных онлайн-заказов. Это то, к чему я стремился:
- Загрузите страницу
- Анимируйте мою службу OData, возвращая последние 100 заказов (заказывая по дате спуска, чтобы сначала появился последний завершенный заказ)
- Создайте HTML на странице с помощью данных ODatali >
- Сохранить дату MAX в глобальной переменной (выглядит так:/Дата (1338336000000)/)
- Нажмите службу OData на 30-секундный интервал, но на этот раз укажите фильтр, чтобы возвращать только записи, где дата заказа больше предыдущей даты MAX. В этом случае:/Дата (1338336000000)/
- Если какие-либо записи возвращены, создайте HTML для этих записей и добавьте элементы к ранее загруженным элементам.
Где я боюсь, указывается фильтр "Больше", чем "Дата". По какой-то причине фильтры даты в OData, похоже, не очень приятны с собственным исходным форматом даты OData. Нужно ли мне преобразовать дату, первоначально полученную в другой формат, который можно использовать для фильтрации?
Я хочу сделать что-то вроде этого:
[http://mydomain/Services/v001.svc/Orders?$filter=close_dt gt 1338336000000][1]
FYI: Я использую V2
Ответы
Ответ 1
Выяснил это.
OData V2 вне коробки возвращает даты SQL в формате JSON Date так:
/Date(1338282808000)/
Однако, чтобы использовать дату как фильтр в вызове OData, ваша дата должна быть в формате EDM, выглядящей так:
2012-05-29T09:13:28
Итак, мне нужно было получить дату из моего первоначального вызова OData, а затем преобразовать ее в формат EDM для использования в моих последующих вызовах OData, которые выглядят следующим образом:
/Services/v001.svc/Orders?$filter=close_dt gt DateTime'2012-05-29T09:13:28'
В итоге я создал функцию javascript, которая выполняет форматирование switcharoo:
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'
}
Несколько примечаний:
- Формат JSON, похоже, не настроен на часовой пояс, поэтому возвращаемая дата не соответствует дате, которую я вижу в моей базе данных. Поэтому мне пришлось добавить время вручную, чтобы компенсировать (кто-то, пожалуйста, объясните это).
- Я использую плагин date.format.js, который вы можете скачать здесь для форматирования даты и добавление времени.
Ответ 2
В формате OData V4 формат даты изменился на $filter=close_dt gt 2006-12-30T23:59:59.99Z
Например
http://services.odata.org/V4/OData/OData.svc/Products?$filter=ReleaseDate%20gt%202006-12-30T23:59:59.99Z
Для предыдущих версий OData см. предыдущие ответы
Ответ 3
Просто FYI: в V3 протокола формат даты и времени без тика теперь по умолчанию:
http://services.odata.org/Experimental/OData/OData.svc/Products%280%29?$format=application/json;odata = многословным & $= выбрать ReleaseDate
... "ReleaseDate": "1992-01-01T00: 00: 00" ...
Ответ 4
Если вы используете логику datetime, вы можете сделать lt или gt.
например. ... mydomain/Services/v001.svc/Заказы? $filter = close_dt gt datetime'20141231 '