RedisSearch中大于指定Datetime的JSON查询失效问题求助
Redis JSON日期字段大于查询失效问题
问题详情
我尝试从Redis JSON存储中查询Expires_At属性值大于DateTime.UtcNow的条目,代码如下:
var datetime = DateTime.UtcNow; var obj = json.Get(key, path: $"$.event[?(@.Expires_At>="{datetime}")]");
但这个查询找不到目标数据,而用小于条件查询Starts_At的代码却能正常返回结果:
var datetime = DateTime.UtcNow; var obj2 = json.Get<T>(key, path: $"$.event[?(@.Starts_At<"{datetime}")]");
我搜过Redis处理日期字段比较的相关内容,没找到合适的大于/小于查询示例,希望能解决Expires_At字段值大于DateTime.UtcNow的查询问题。
补充:存储的JSON数据日期格式如下:
Starts_At: "2023-06-24T18:54:07.682Z"Expires_At: "2023-06-29T18:54:07.682Z"
解决方案
Redis JSON的路径表达式中,日期字符串比较依赖ISO 8601格式的字典序,问题根源有两个:一是DateTime.UtcNow默认格式化输出和存储的日期格式不匹配,二是引号嵌套导致路径表达式语法错误。
修复代码
// 统一格式为带毫秒和时区Z的ISO 8601字符串 var datetime = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"); // 用单引号包裹日期,避免和外层双引号冲突 var obj = json.Get(key, path: $"$.event[?(@.Expires_At > '{datetime}')]");
核心说明
- Redis JSON对字符串类型日期的比较是按字典序进行的,只要两端日期都是标准ISO 8601格式(
yyyy-MM-ddTHH:mm:ss.fffZ),就能正确判断大小 - 必须保证格式化后的日期包含毫秒部分和时区标识
Z,和存储的数据格式完全一致 - 使用单引号包裹日期参数,避免字符串插值时的双引号嵌套冲突,防止路径表达式解析错误
内容的提问来源于stack exchange,提问作者Hlib Dolinin
相关产品推荐
相关产品推荐

