You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 23:12:55