ODATA日期查询

时间:2013-04-24 15:38:32

标签: date odata

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

查询应该如何?

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

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

选项二:月份(DATE)eq 04天(DATE)eq 04 year(DATE)eq 2013:这很麻烦

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

这应该非常简单,因为它在T-SQL中。

2 个答案:

答案 0 :(得分:13)

OData v3没有仅Date的原始数据类型。您拥有的属性是DateTimeDateTimeOffset,因此,无论您是否使用它,该值的时间部分都有,如果您要检查值相等,也必须检查时间组件。

如果您确定永远不会使用时间部分(并始终将其设置为00:00),则可以执行以下查询:

/service.svc/EntitySet?$filter=DateProperty+eq+datetime'2013-04-04'

表示00:00的时间部分。但那只是速记。如果您的某些日期时间最终结束时间部分不是00:00,则可能会出现意外结果。

所以,鉴于您只想检查值的日期部分,而不是完全相等,我认为您提到的第二种方法是实现它的最佳方式:

/service.svc/EntitySet?$filter=day(DateProperty)+eq+4+and+month(DateProperty)+eq+4+and+year(DateProperty)+eq+2013

这样你就可以确切地检查你的意思,而不是更多。

对于它的价值,我相信OData v4中会出现Date数据类型。然后你就可以使用相等检查而不必担心时间。

答案 1 :(得分:2)

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

  • 的LINQ:
来自事件中的ev的

    其中ev.Start> = DateTime.Now.Date     选择ev

  • LINQPAD生成Odata URI:

    http://yoursite/_vti_bin/listdata.svc/Events()?$filter=Start ge datetime'2013-12-05T00:00:00+01:00'
  • 将其调整为正确的格式。在我的情况下,我删除“+01:00”。

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