Strapi按日期查询时updated_at比较条件不生效问题求助
问题根因
你的代码存在两个核心错误导致筛选不生效:
- Strapi v3 查询语法错误:直接将比较运算符和参数拼接为字符串传给
updated_at字段不符合Strapi的筛选规则,正确写法是给字段名添加运算符后缀 - 时间类型不匹配:你生成的
nd是秒级Unix时间戳,但Strapi默认的updated_at字段存储的是ISO 8601格式的DateTime类型数据,两者类型不一致无法正常比较
修复方案
方案1:使用官方标准筛选语法(推荐)
使用Strapi v3 内置的_gte后缀表示大于等于筛选,直接传入Date类型对象即可,无需转换为时间戳,修改后代码如下:
module.exports = async () => { const currentTime = new Date(); strapi.log.info(`当前UTC时间为: ${currentTime.toISOString()}`); const getEvents = async (time) => { try { const events = await strapi.query("festival").find({ _limit: 500, isParent: false, isActive: true, // 字段名加_gte后缀表示大于等于,直接传入时间对象即可 updated_at_gte: time }); if(events.length > 0) { const lastEvent = JSON.stringify(events[events.length - 1]); strapi.log.info(`共查询到${events.length}条符合条件的活动,最后一条为:${lastEvent}`); } else { strapi.log.info('未查询到符合条件的活动'); } return events; } catch (err) { strapi.log.error("查询festival数据失败", err); } }; return getEvents(currentTime); };
方案2:自定义字段存储时间戳的适配方案
如果你是自定义修改了updated_at字段为Unix时间戳存储,可以直接使用原生查询保证筛选正确,以MySQL为例:
const nd = Math.floor(Date.now() / 1000); const events = await strapi.connections.default.raw( `SELECT * FROM festivals WHERE isParent = 0 AND isActive = 1 AND updated_at >= ? LIMIT 500`, [nd] );
注意事项
- 如果你使用的是Strapi v4版本,筛选语法需要调整为嵌套结构:
filters: { updated_at: { $gte: currentTime } } - 排查问题时可以先打印数据库中
updated_at的实际存储值,确认和传入的参数类型一致,避免类型不匹配导致筛选失效 - 访问数组下标前先判断数组长度,避免空数组时取值报错
内容的提问来源于stack exchange,提问作者theCodingPro
相关产品推荐
相关产品推荐

