web-dev-qa-db-ja.com

ODATA日付クエリ

たとえば、2013年4月4日の日付のレコードを返す必要があります。 ODATAサービスの日付フィールドは{DATE: "2013-04-04T17:39:33.663"}として返されます

クエリはどのように見えるはずですか?

これまで、これを行うための3つのオプションを見てきましたが、どれも簡単ではありません。

オプション1:日時 '2013-04-04T12:00':これには時間の指定が必要です

オプション2:月(日付)eq 04日(日付)eq 04年(日付)eq 2013:これは面倒です

オプション3:オプション1を「ge」と「le」とともに使用して2つの日付の間のレコードを取得する:これもがらくたです。

これは、T-SQLの場合と同様に、非常に単純なはずです。

10
LastTribunal

OData v3には、Dateだけのプリミティブデータ型はありません。所有しているプロパティはDateTimeまたはDateTimeOffsetのいずれかであるため、使用しているかどうかに関係なく、その値の時間部分があり、チェックする場合は等しい値の場合、時間コンポーネントもチェックする必要があります。

時間部分を決して使用しない(そして常に00:00に設定する)ことが確実にわかっている場合は、could次のクエリを実行します。

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

これは、00:00の時間部分を意味します。しかし、それは単なる速記です。また、DateTimeの一部が00:00以外の時間部分になってしまうと、予期しない結果が生じる可能性があります。

したがって、値の日付部分を確認するだけで、完全に等しいわけではないことを考えると、2番目のアプローチが最善の方法だと思います。

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

そうすれば、チェックする意味を正確にチェックし、それ以上のことは何もしません。

その価値については、Dateデータ型がODatav4で提供されると思います。そうすれば、時間を気にせずに等価性チェックを使用できるようになります。

14
Jen S

さらに、ODataリクエストの生成に [〜#〜] linqpad [〜#〜] を使用することもできます。 LINQリクエストを行う必要があり、LINQPADは正しいURIを生成します。例えば:

  • Linq:

ev.Start> = DateTime.Now.Date selectevのイベントのevから

  • LINQPADはOdataURIを生成します。

    http://yoursite/_vti_bin/listdata.svc/Events()?$ filter = Start ge datetime '2013-12-05T00:00:00 + 01:00'
  • 正しいフォーマットに調整してください。私の場合、「+ 01:00」を削除します。

また、VisualStudioを使用してOdataリクエストを取得することもできます。

2
Ruslan Korkin