我正在使用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')
答案 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'”