天蓝色时间戳过滤选错了日期

时间:2016-03-30 21:52:03

标签: azure timestamp azure-storage azure-web-sites azure-table-storage

我正在使用azure表存储并尝试仅在特定日期过滤记录。

datetime filterDate = '3/29/2016 12:00:00 AM'

我尝试了以下查询,但它为 29和30 提取记录。可能是什么问题?

 var queryToday = TableQuery.GenerateFilterConditionForDate("Timestamp", QueryComparisons.GreaterThanOrEqual, filterDate);
            var querySelectedDate = TableQuery.CombineFilters(queryToday, TableOperators.And, TableQuery.GenerateFilterConditionForDate("Timestamp", QueryComparisons.LessThan, filterDate.AddDays(1)));

我调试并发现过滤字符串为

(Timestamp ge datetime'2016-03-29T07:00:00.0000000Z') and (Timestamp lt datetime'2016-03-30T07:00:00.0000000Z')

3 个答案:

答案 0 :(得分:2)

看起来像是时区问题。你可能想在3月29日午夜到3点30分午夜之间搜索,而是在3/29 3/29和3/30之间搜索。

您是否住在UTC-7时区(如MDT)或UTC +7时区(如ETC)? api最有可能试图弥补您/您的站点所在的时区以及它假定时间戳所在的时区(可能是UTC时间)

答案 1 :(得分:2)

请先将日期时间转换为UTC。

var universalFilterDate = filterDate.ToUniversalTime();
var queryToday = TableQuery.GenerateFilterConditionForDate("Timestamp", QueryComparisons.GreaterThanOrEqual, universalFilterDate);
var querySelectedDate = TableQuery.CombineFilters(queryToday, TableOperators.And, TableQuery.GenerateFilterConditionForDate("Timestamp", QueryComparisons.LessThan, universalFilterDate.AddDays(1)));

答案 2 :(得分:1)

我正在使用Windows Azure Storage 7.0.0,您可以使用Linq查询,这样您就不必转换为UTC:

// initialize the filterdate
var filterDate = DateTime.Parse("01/02/2016 12:00:00 AM");

// Get the cloudtable ...
var cloudTable = GetCloudTable();

// Create a query: in this example I use the DynamicTableEntity class
var query = cloudTable.CreateQuery<DynamicTableEntity>()
    .Where(d => d.Timestamp > filterDate);

var result = query.ToList();

如果检查query.FilterString属性,可以看到日期时间已转换为UTC日期时间:

  

“时间戳gt datetime'2016-01-31T11:00:00Z'”