天蓝色时间戳过滤选择了错误的日期
azure time stamp filtering picks wrong dates
我正在使用 azure table 存储并尝试仅过滤某一天的记录。
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 月 29 日午夜和 3 月 30 日午夜之间搜索,但它是在 3 月 29 日上午 7 点到 3 月 30 日上午 7 点之间搜索。
您住在 UTC-7 时区(如 MDT)还是 UTC +7 时区(如 ETC)? api 很可能试图补偿 you/your 站点所在的时区以及它假定时间戳所在的时区(可能是 UTC 时间)
请先将日期时间转换为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)));
我正在使用 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 日期时间:
"Timestamp gt datetime'2016-01-31T11:00:00Z'"
我正在使用 azure table 存储并尝试仅过滤某一天的记录。
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 月 29 日午夜和 3 月 30 日午夜之间搜索,但它是在 3 月 29 日上午 7 点到 3 月 30 日上午 7 点之间搜索。
您住在 UTC-7 时区(如 MDT)还是 UTC +7 时区(如 ETC)? api 很可能试图补偿 you/your 站点所在的时区以及它假定时间戳所在的时区(可能是 UTC 时间)
请先将日期时间转换为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)));
我正在使用 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 日期时间:
"Timestamp gt datetime'2016-01-31T11:00:00Z'"