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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 06:15:04