2013-04-24 41 views
8

我需要返回日期爲4/4/2013(例如)的記錄。 ODATA服務中的日期字段返回爲{DATE:「2013-04-04T17:39:33.663」}ODATA DATE QUERY

查詢應如何看起來像?

到目前爲止,我已經看到了三個選擇來做到這一點,但沒有一個是直截了當的。

選項之一:datetime'2013-04-04T12:00' :這需要時間規範

選項二:月(DATE)EQ04天(DATE)EQ04年(DATE)EQ 2013:這很麻煩

選項三:使用'ge'和'le'選項來獲取2個日期之間的記錄:這也是廢話。

這應該非常簡單,因爲它在T-SQL中。

回答

12

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 

你正在檢查你的意思是要檢查什麼,沒有更多。

對於它的價值,我相信Date數據類型將進入OData v4。然後你就可以使用平等檢查而不用擔心時間。

+0

oData V3中的第一部分不適用於我 – Matt 2015-04-21 20:42:45

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'
  • 將其調整爲c格式正確。在我的情況下,我刪除了「+01:00」。

此外,您可以使用Visual Studio獲取Odata請求。