Azure中的时间戳查询

时间:2013-06-26 16:21:18

标签: c# azure-storage azure-table-storage

我真的陷入Azure表存储的查询过滤器中。 我可以知道如何查询时间戳吗? 当我单独查询分区键1005时,我得到了我不想要的完整表格。 当我添加"和"带有时间戳的条件(尝试了很多格式,但它没有返回任何内容。下面的代码片段:

var lowerlimit = DateTime.Today.AddDays(-52).ToString("yyyy-MM-dd");

string dateRangeFilter = TableQuery.CombineFilters(
    TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "1005"),
    TableOperators.And,
    TableQuery.GenerateFilterCondition("TimeStamp", QueryComparisons.GreaterThanOrEqual, lowerlimit));

4 个答案:

答案 0 :(得分:15)

我可以将时间戳与Microsoft.WindowsAzure.Storage版本4.0.1.0一起使用。 只是和示例

var query = TableQuery.CombineFilters(
            TableQuery.GenerateFilterCondition("Level", QueryComparisons.Equal, "ERROR"), 
            TableOperators.And, 
            TableQuery.GenerateFilterConditionForDate("Timestamp", QueryComparisons.GreaterThanOrEqual, DateTimeOffset.Now.AddDays(-20).Date));

var query2 = TableQuery.CombineFilters(query,
            TableOperators.And, 
            TableQuery.GenerateFilterConditionForDate("Timestamp", QueryComparisons.LessThanOrEqual, DateTimeOffset.Now));

var exQuery = new TableQuery<LogEntry>().Where(query2);

CloudTableClient tableClient = _storageAccount.CreateCloudTableClient();

CloudTable table = tableClient.GetTableReference(_tableName);
var results = table.ExecuteQuery(exQuery).Select(ent => (T) ent).ToList();

答案 1 :(得分:4)

属性名称区分大小写。它应该是Timestamp而不是TimeStamp。

答案 2 :(得分:4)

时间戳可用于查询Azure表存储中的行。

但是,您需要使用TableQuery.GenerateFilterConditionForDate代替TableQuery.GenerateFilterCondition。对于任何DateTime列,必须使用TableQuery.GenerateFilterConditionForDate

从代码示例中,为时间戳过滤器更改GenerateFilterConditionGenerateFilterConditionForDate

var lowerlimit = DateTime.Today.AddDays(-52).ToString("yyyy-MM-dd");

string dateRangeFilter = TableQuery.CombineFilters(
    TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "1005"),
    TableOperators.And,
    TableQuery.GenerateFilterConditionForDate("TimeStamp", QueryComparisons.GreaterThanOrEqual, lowerlimit));

答案 3 :(得分:3)

如果这是诊断表(例如WADLogsTable),我建议您将时间戳转换为分区键,然后查询。这将避免全表扫描,因为它是索引列。转换很简单,只是前置&#34; 0&#34;到了蜱虫。

var lowerlimitPartitionKey = DateTimeToPartitionKey(lowerlimit);

// Now query PartitionKey >= lowerlimitPartitionKey
...

,其中

private string DateTimeToPartitionKey(DateTime dt)
{
    return "0" + dt.Ticks;
}