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

Sequelize查询仅前一天数据异常,求问题原因及修正方案

问题原因及修复方案

你的代码只设置了added_at的下限(大于等于昨天),但没有限制上限,这会导致如果数据库时区和本地调试时区不一致,或者added_at字段时间格式有差异时,出现不符合预期的结果。另外,你要的是仅昨天一整天的数据,正确做法是同时限定范围:大于等于昨天0点,且小于今天0点。

修复后的代码方案

方案一:用JavaScript日期对象构造范围

checkDateBack: async function() {
  // 构造昨天0点的时间
  const yesterdayStart = new Date();
  yesterdayStart.setDate(yesterdayStart.getDate() - 1);
  yesterdayStart.setHours(0, 0, 0, 0);

  // 构造今天0点的时间
  const todayStart = new Date();
  todayStart.setHours(0, 0, 0, 0);

  return await dayins.findAll({
    where: {
      added_at: {
        [Op.gte]: yesterdayStart,
        [Op.lt]: todayStart
      }
    },
    raw: true,
  })
}

方案二:用Sequelize literal直接写SQL范围

checkDateBack: async function() {
  return await dayins.findAll({
    where: {
      added_at: {
        [Op.gte]: Sequelize.literal("DATE_SUB(CURDATE(), INTERVAL 1 DAY)"),
        [Op.lt]: Sequelize.literal("CURDATE()")
      }
    },
    raw: true,
  })
}

为什么原代码会出错?

原代码仅用[Op.gte]: Sequelize.literal("DATE_SUB(CURDATE(), INTERVAL 1 DAY)"),意味着只要added_at大于等于昨天的日期就会被返回。如果数据库时区和你本地调试时区不一致(比如数据库是UTC时区,本地是东八区,导致CURDATE()返回的日期比本地晚一天),就可能错误地包含前天的数据。即使时区一致,这个条件也会包含今天的数据,不符合你“仅获取昨天数据”的需求。加上[Op.lt]: Sequelize.literal("CURDATE()")后,就能严格限定只匹配昨天一整天的数据。

内容的提问来源于stack exchange,提问作者IFThenElse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 14:06:18