10

我需要返回日期为 2013 年 4 月 4 日的记录(例如)。ODATA 服务中的日期字段返回为 {DATE: "2013-04-04T17:39:33.663"}

查询应该是什么样子?

到目前为止,我已经看到了三个选项来做到这一点,但没有一个是直截了当的。

选项一:datetime'2013-04-04T12:00':这需要指定时间

选项二:month(DATE) eq 04 day(DATE) eq 04 year(DATE) eq 2013:这很麻烦

选项三:使用带有“ge”和“le”的选项一来获取两个日期之间的记录:这也是废话。

这应该非常简单,就像在 T-SQL 中一样。

4

2 回答 2

15

OData v3 没有原始数据类型,它只是Date. 您拥有的属性是 aDateTime或 a 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

这样,您就可以准确地检查您要检查的内容,仅此而已。

对于它的价值,我相信DateOData v4 中会出现一种数据类型。然后,您将能够使用相等检查而不必担心时间。

于 2013-04-24T21:15:55.577 回答
2

另外我想说的是,你也可以使用LINQPAD来生成 OData 请求。您应该发出 LINQ 请求,LINQPAD 将生成正确的 URI。例如:

  • 林克:

从 ev 在 ev.Start >= DateTime.Now.Date 的事件中选择 ev

  • LINQPAD 生成 Odata URI:

    http://yoursite/_vti_bin/listdata.svc/Events()?$filter=开始日期时间'2013-12-05T00:00:00+01:00'
  • 将其调整为正确的格式。就我而言,我删除了“+01:00”。

您也可以使用 Visual Studio 获取 Odata 请求。

于 2013-12-06T07:06:07.483 回答