OData:日期"大于"过滤器

lam*_*ant 37 odata

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

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

  1. 加载页面
  2. 异步命中我的OData服务,返回最后100个订单(按日期排序降序,以便最近完成的订单首先显示)
  3. 使用OData数据在页面上构建HTML
  4. 将MAX日期存储到全局变量中(如下所示:/ Date(1338336000000)/)
  5. 以30秒的间隔命中OData服务,但这次指定的过滤器仅返回订单日期大于上一个MAX日期的记录.在这种情况下:/日期(1338336000000)/
  6. 如果返回任何记录,请为这些记录构建HTML,并将项目添加到先前加载的项目中.

我正在努力的是指定日期"大于"过滤器.出于某种原因,OData中的日期过滤器似乎与OData自己的本机日期格式不太匹配.我是否需要将最初获得的日期转换为可用于过滤的其他格式?

我想做这样的事情:

[http://mydomain/Services/v001.svc/Orders?$filter=close_dt gt 1338336000000][1]
Run Code Online (Sandbox Code Playgroud)

仅供参考:我正在使用V2

lam*_*ant 44

想出这个.

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

/Date(1338282808000)/
Run Code Online (Sandbox Code Playgroud)

但是,为了在OData调用中使用日期作为过滤器,您的日期必须采用EDM格式,如下所示:

2012-05-29T09:13:28
Run Code Online (Sandbox Code Playgroud)

所以,我需要从我最初的OData调用中获取日期,然后将其转换为EDM格式,以便在我后续的OData调用中使用,如下所示:

/Services/v001.svc/Orders?$filter=close_dt gt DateTime'2012-05-29T09:13:28' 
Run Code Online (Sandbox Code Playgroud)

我最终创建了一个执行格式化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'
    }
Run Code Online (Sandbox Code Playgroud)

几个笔记:

  • JSON格式似乎没有针对时区进行调整,因此返回的日期与我在数据库中看到的日期不匹配.所以我不得不手动补充时间来补偿(有人请解释一下).
  • 我正在使用date.format.js插件,您可以在此处下载格式化日期和添加时间.

  • 在我的例子中,基于 Olingo V2 的 ODate V2 实现,函数名称应该是“datetime”而不是“DateTime”。 (2认同)

avi*_*erg 30

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


小智 5

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

例如 ...mydomain/Services/v001.svc/Orders?$filter=close_dt gt datetime'20141231'