【问题标题】:ODATA DATE QUERYODATA日期查询
【发布时间】:2013-12-06 15:06:07
【问题描述】:

我需要返回日期为 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 中一样。

【问题讨论】:

    标签: date odata


    【解决方案1】:

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

    如果您确定您从不使用时间部分(并且始终将其设置为 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
    

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

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

    【讨论】:

      【解决方案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 请求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-24
        • 2017-02-15
        • 2014-08-29
        • 1970-01-01
        相关资源
        最近更新 更多