48

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

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

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

我苦苦挣扎的地方是指定日期“大于”过滤器。出于某种原因,OData 中的日期过滤器似乎与 OData 自己的本机日期格式不太匹配。我是否需要将最初获得的日期转换为可用于过滤的不同格式?

我想做这样的事情:

http://mydomain/Services/v001.svc/Orders?$filter=close_dt%20gt%201338336000000

仅供参考:我正在使用 V2

4

4 回答 4

58

想通了。

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插件,您可以在此处下载该插件来格式化日期和添加时间。
于 2013-01-18T19:07:31.510 回答
51

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

于 2015-07-07T19:24:32.553 回答
4

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

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

于 2014-05-23T21:45:08.313 回答
4

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

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

... “发布日期”:“1992-01-01T00:00:00” ...

于 2013-02-05T21:44:05.330 回答