使用Sequelize查询日期小于当前日期的数据无返回如何解决
问题原因&解决方案
1. 操作符写法不兼容当前Sequelize版本
Sequelize v4及之后的版本默认禁用了$lt这类字符串格式的操作符,需要使用官方导出的Op对象内的操作符才会生效,否则查询条件会被Sequelize忽略,导致返回结果异常。
修正方法:
首先导入操作符对象:
const { Op } = require('sequelize');
把查询条件里的$lt替换为[Op.lt]:
where: { campaign_end_date: { [Op.lt]: nowDate } }
2. 时区不匹配导致日期比对错误
你当前用moment()生成的是本地时区的日期,而PostgreSQL里的campaign_end_date字段大概率是UTC时区存储,两边时区差会导致实际比对的日期和你预期的不一致。
修正方法:
生成UTC对齐的日期,或者直接转成标准日期字符串进行比对,避免时区干扰:
// 方案1:生成UTC时区的7天前日期 let nowDate = moment.utc().startOf('day').subtract(7, 'days').toDate(); // 方案2:直接转成YYYY-MM-DD格式字符串,适配数据库date类型字段 let nowDate = moment().startOf('day').subtract(7, 'days').format('YYYY-MM-DD');
3. 排查实际生成的SQL确认问题
你可以在findAll方法中添加日志参数,打印出生成的原生SQL语句,直接复制到PostgreSQL中执行,就能快速定位是查询条件错误还是确实没有符合条件的数据:
const campaign = await Campaigns.findAll({ where: { campaign_end_date: { [Op.lt]: nowDate } }, attributes: ['campaign_id', 'campaign_end_date'], logging: console.log, // 新增这行打印SQL required: true });
完整修正后代码示例
const { Op } = require('sequelize'); // 转成日期字符串适配数据库date类型,避免时区问题 let nowDate = moment().startOf('day').subtract(7, 'days').format('YYYY-MM-DD'); console.log(nowDate); const campaign = await Campaigns.findAll({ where: { campaign_end_date: { [Op.lt]: nowDate } }, attributes: ['campaign_id', 'campaign_end_date'], required: true });
内容的提问来源于stack exchange,提问作者arunwebber
相关产品推荐
相关产品推荐

