web-dev-qa-db-ja.com

OData:日付「より大きい」フィルター

「xxxxxよりも大きい日付」フィルターを指定することでODataに一連のレコードを返す方法はありますが、ODataフィードから以前に取得した日付を使用していますか?

ユースケース:最後に完了したオンライン注文のリストを表示するWebページを作成したいものとします。これは私が目指しているものです:

  1. ページを読み込む
  2. ODataサービスを非同期にヒットし、最後の100件の注文を返します(日付の降順で並べ替えて、最後に完了した注文が最初に表示されるようにします)
  3. ODataデータを使用してページにHTMLを構築します
  4. MAXの日付をグローバル変数に保存します(/ Date(1338336000000)/のようになります)
  5. 30秒間隔でODataサービスをヒットしますが、今回はフィルターを指定して、注文日が前のMAX日付よりも大きいレコードのみを返すようにします。この場合:/ Date(1338336000000)/
  6. レコードが返された場合、それらのレコードのHTMLを構築し、以前にロードされたアイテムにアイテムを追加します。

私が苦労しているのは、日付の「より大きい」フィルターを指定することです。何らかの理由で、ODataの日付フィルターは、ODataの固有の日付形式ではあまりうまく機能しないようです。最初に取得した日付を、フィルタリングに使用できる別の形式に変換する必要がありますか?

私はこのようなことをしたい:

[http://mydomain/Services/v001.svc/Orders?$filter=close_dt gt 1338336000000][1]

参考:V2を使用しています

34
lamarant

これを考え出した。

OData V2はそのままで、SQLから日付をJSON日付形式で次のように返します。

/Date(1338282808000)/

ただし、OData呼び出し内でフィルターとして日付を使用するには、次のように日付をEDM形式にする必要があります。

2012-05-29T09:13:28

したがって、最初のOData呼び出しから日付を取得し、それを次のようなOData呼び出しで使用するためにEDM形式に変換する必要がありました。

/Services/v001.svc/Orders?$filter=close_dt gt DateTime'2012-05-29T09:13:28' 

最終的に、フォーマットを切り替えるjavascript関数を作成しました。

function convertJSONDate(jsonDate, returnFormat) {
        var myDate = new Date(jsonDate.match(/\d+/)[0] * 1);
        myDate.add(4).hours();  //using {date.format.js} to add time to compensate for timezone offset
        return myDate.format(returnFormat); //using {date.format.js} plugin to format :: EDM FORMAT='yyyy-MM-ddTHH:mm:ss'
    }

いくつかのメモ:

  • JSON形式はタイムゾーンに合わせて調整されていないように見えるため、返される日付はデータベースに表示される日付と一致しません。そのため、手動で時間を追加して補正する必要がありました(誰か説明してください)。
  • 私は date.format.js プラグインを使用しています。このプラグインは here をダウンロードして、日付のフォーマットと時間の追加に使用できます。
39
lamarant

OData V4では、日付フィルタリング形式が$filter=close_dt gt 2006-12-30T23:59:59.99Zに変更されました

例えば

http://services.odata.org/V4/OData/OData.svc/Products?$filter=ReleaseDate%20gt%202006-12-30T23:59:59.99Z

ODataの以前のバージョンについては、以前の回答を参照してください

27
avitenberg

参考までに:プロトコルのV3では、非ティックベースの日時形式がデフォルトになりました。

http://services.odata.org/Experimental/OData/OData.svc/Products%280%29?$format=application/json;odata=verbose&$select=ReleaseDate

... "ReleaseDate": "1992-01-01T00:00:00"...

3
Matt Meehan

日時ロジックを使用する場合、ltまたはgtを実行できます。

例えば... mydomain/Services/v001.svc/Orders?$ filter = close_dt gt datetime'20141231 '

2
Cote Adams