OData:日期“大于”过滤器

时间:2013-01-17 20:36:46

标签: odata

有没有办法通过指定“日期大于xxxxx”过滤器来返回OData中的一系列记录...但是使用之前从OData Feed获得的日期?

使用案例:假设我要构建一个显示最近完成的在线订单列表的网页。这就是我的目标:

  1. 加载页面
  2. 异步点击我的OData服务,返回最后100个订单(按日期排序,以便最近完成的订单首先显示)
  3. 使用OData数据在页面上构建HTML
  4. 将MAX日期存储为全局变量(如下所示:/ Date(1338336000000)/)
  5. 以30秒的间隔点击OData服务,但这次指定的过滤器仅返回订单日期大于上一个MAX日期的记录。在这种情况下:/ Date(1338336000000)/
  6. 如果返回任何记录,请为这些记录构建HTML并将这些项目添加到之前加载的项目中。
  7. 我正在努力的是指定日期“大于”过滤器。出于某种原因,OData中的日期过滤器似乎与OData自己的本机日期格式不太匹配。我是否需要将最初获得的日期转换为可用于过滤的其他格式?

    我想做这样的事情:

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

    仅供参考:我正在使用V2

4 个答案:

答案 0 :(得分:37)

想出来了。

OData V2开箱即用以JSON日期格式返回SQL的日期,如下所示:

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

我最终创建了一个执行格式化switcharoo的javascript函数:

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插件,您可以下载here来格式化日期和添加时间。

答案 1 :(得分:25)

在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,请参阅以前的答案

答案 2 :(得分:3)

仅仅是一个FYI:在协议的V3中,基于非刻度的日期时间格式现在是默认格式:

http://services.odata.org/Experimental/OData/OData.svc/Products%280%29?$format=application/json;odata=verbose&$select=ReleaseDate

... <强> “RELEASEDATE”: “1992-01-01T00:00:00” ...

答案 3 :(得分:2)

如果您使用日期时间逻辑,则可以执行lt或gt。

e.g。     ... mydomain / Services / v001.svc / Orders?$ filter = close_dt gt datetime'20141231'