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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 03:45:06