Azure table 存储无效输入
Azure table storage Invalid input
我正在使用 Java 查询 Azure table 存储服务。
我正在查询基于时间戳的 Azure table。在执行查询之前,我将本地 java 日期转换为 UTC。
查询抛出 TableServiceException“其中一个请求输入无效。
RequestId:59445f16-0002-007e-152d-b3e24d000000
Time:2016-05-21T06:50:34.5077574Z
当我使用相同的日期并使用 Azure 存储资源管理器查询数据时;我能够获得所需的值,如下面的屏幕截图所示。
http://puu.sh/oZD6y/eadcc45859.png 这让我想知道我做错了什么。
下面是我用来查询 Azure Table 的代码。 endDate 是日期类型
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());
这已经浪费了我很多时间。任何帮助将不胜感激。
(PartitionKey eq '1') and (Timestamp le 1463796341217L)
基本上您的查询有问题。本质上 Timestamp
是一种 date/time
类型的属性,所以如果您自己编写 ODATA 查询,您的查询应该类似于:
(PartitionKey eq '1') and (Timestamp le datetime'some-date-time-value')
如果您注意到,这也是您在 Azure 存储资源管理器中所做的事情。
查看您的代码,您正在 endDate
上调用 getTime()
方法,这将 return 自格林威治标准时间 00:00:00 1970 年 1 月 1 日以来经过的毫秒数。您需要做的就是按原样使用 endDate
。然后 SDK 会将查询转换为 Azure Table 服务可以理解的格式。
我正在使用 Java 查询 Azure table 存储服务。
我正在查询基于时间戳的 Azure table。在执行查询之前,我将本地 java 日期转换为 UTC。
查询抛出 TableServiceException“其中一个请求输入无效。 RequestId:59445f16-0002-007e-152d-b3e24d000000 Time:2016-05-21T06:50:34.5077574Z
当我使用相同的日期并使用 Azure 存储资源管理器查询数据时;我能够获得所需的值,如下面的屏幕截图所示。
http://puu.sh/oZD6y/eadcc45859.png 这让我想知道我做错了什么。
下面是我用来查询 Azure Table 的代码。 endDate 是日期类型
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());
这已经浪费了我很多时间。任何帮助将不胜感激。
(PartitionKey eq '1') and (Timestamp le 1463796341217L)
基本上您的查询有问题。本质上 Timestamp
是一种 date/time
类型的属性,所以如果您自己编写 ODATA 查询,您的查询应该类似于:
(PartitionKey eq '1') and (Timestamp le datetime'some-date-time-value')
如果您注意到,这也是您在 Azure 存储资源管理器中所做的事情。
查看您的代码,您正在 endDate
上调用 getTime()
方法,这将 return 自格林威治标准时间 00:00:00 1970 年 1 月 1 日以来经过的毫秒数。您需要做的就是按原样使用 endDate
。然后 SDK 会将查询转换为 Azure Table 服务可以理解的格式。