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
相关产品推荐
相关产品推荐

