2016-05-21 12 views
0

Javaを使用してAzureテーブルストレージサービスをクエリしています。Azureテーブルストレージ無効な入力

私は、タイムスタンプに基づいてAzureテーブルを照会しています。クエリを実行する前に、ローカルのJava日付をUTCに変換しました。

クエリは、 "要求入力の1つが有効でない RequestId。:59445f16-0002-007e-152D-b3e24d000000 時間:2016-05-21T06:50:34.5077574Z" TableServiceExceptionを投げている

Azure Storageエクスプローラを使用して、同じ日付とクエリデータを使用しました。下のスクリーンショットに示すように、私は希望の値を得ることができます。

http://puu.sh/oZD6y/eadcc45859.pngこれは私が間違って何をしているのだろうかと思います。

以下はAzure Tableを照会するためのコードです。 endDateには、Date型のコードの下

String partitionFilter = TableQuery.generateFilterCondition(PARTITION_KEY, QueryComparisons.EQUAL, 
      partitionKey); 
    String date2 = TableQuery.generateFilterCondition(TIMESTAMP, QueryComparisons.LESS_THAN_OR_EQUAL, endDate.getTime()); 
    String finalFilter = TableQuery.combineFilters(partitionFilter, Operators.AND, date2); 

    CloudTable table = getTable(tableName); 
    TableQuery<TableServiceEntity> query = TableQuery.from(TableServiceEntity.class).where(finalFilter); 
    Iterable<TableServiceEntity> tableEntries = table.execute(query); 
    return tableEntries; 

であることは、ローカルの日付に

long ts = System.currentTimeMillis(); 
    Date localTime = new Date(ts); 
    String format = "yyyy/MM/dd HH:mm:ss"; 
    SimpleDateFormat sdf = new SimpleDateFormat (format); 


    sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 
    Date gmtTime = new Date(sdf.format(localTime)); 
    System.out.println("Local:" + localTime.toString() + "," + localTime.getTime() + " --> UTC time:" + gmtTime.toString() + "-" + gmtTime.getTime()); 

を変換するために使用されるこれは、すでに私の時間をたくさん無駄にしました。どんな助けも高く評価されます。

+0

'date2'変数の値を表示できますか?実際には、 'finalFilter'の値を表示する方がずっと簡単です。 –

+0

finalFilterの値は(PartitionKey eq '1')、(Timestamp le 1463796341217L) – user1955255

答えて

1

(のPartitionKey EQ '1')及び(タイムスタンプル1463796341217L)

基本的にはあなたのクエリに問題があります。基本的にTimestampはあなたがODATA自身を照会書いていた場合は、クエリのようなものでなければなりませんので、属性のdate/time一種である:

(PartitionKey eq '1') and (Timestamp le datetime'some-date-time-value') 

あなたが気付いた場合、これはあなたにもAzureストレージエクスプローラーでやっているものです。

コードを見ると、メソッドはendDateとなり、1970年1月1日00:00:00 GMTから経過したミリ秒が返されます。あなたがする必要があるのは、そのままendDateです。 SDKは、Azure Table Serviceが理解できる形式でクエリを変換します。

+0

です。本当にありがとうございます。私は実際に質問を投稿した後でも実際に試していました。あなたが言ったことは正しかった、それは私が後で試した方法です。今の問題は、デバッガのショーの値のように私の終了日です。土曜日5月21日08:55:17 IST 2016しかし、私のdate2変数は、タイムスタンプルdatetime'2016-05-21T03:25:17.000Z 'という文字列を表示します。時間に気をつけてください。それは3時25分です。これは私の最終日にあるものと同じではないでしょうか?2016-05-21T08:55:17.000Z。最終的なフィルタは(PartitionKey eq '1')と(Timestamp le datetime '2016-05-21T03:25:17.000Z ') – user1955255

+0

です。解決策を見つけました。実際には、現地時間を過ぎていなければなりません。AzureテーブルサービスはそれをUTC時間に変換します。これが比較の方法です。 – user1955255

関連する問題