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

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'"