48

「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%20gt%201338336000000

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

4

4 に答える 4

58

これを理解しました。

OData V2は、すぐに使用できる状態で、SQLから次のようなJSON日付形式で日付を返します。

/Date(1338282808000)/

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

2012-05-29T09:13:28

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

/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プラグインを使用しています。
于 2013-01-18T19:07:31.510 に答える
51

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の以前のバージョンについては、以前の回答を参照してください

于 2015-07-07T19:24:32.553 に答える
4

参考までに:プロトコルの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" ..。

于 2013-02-05T21:44:05.330 に答える
4

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

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

于 2014-05-23T21:45:08.313 に答える