【问题标题】:Query with date range using Sequelize request with Postgres in Node在 Node 中使用带有 Postgres 的 Sequelize 请求查询日期范围
【发布时间】:2019-06-29 19:29:54
【问题描述】:

我要做的是通过在 Node.js 中使用 Sequelize ORM 来获取两个日期之间的行。我正在使用 PostgreSQL。问题是我提出的请求被 Sequelize 错误地解释了。

这是我用来发出请求的代码

const dbresp = await Table.findAll({
  attributes: [...],
  where: {
    ...
    createdAt: {
       $between: [new Date(Date(startDate)), new Date(Date(endDate))],
       // same effect
       // $lte: new Date(startDate),
       // $gte: new Date(endDate),
    },
  },
  logging: console.log,
  raw: true,
  order: [['createdAt', 'ASC']],
  // limit: count,
});

通过记录原始 SQL 请求,很明显请求不正确

SELECT ...
FROM "table" AS "table"
WHERE "table"."createdAt" = '2019-02-05 21:00:00.000 +00:00'
      "table"."createdAt" = '2019-02-05 21:00:00.000 +00:00'
ORDER BY "table"."createdAt" ASC;

提出此类请求的正确方法是什么?我应该使用原始查询吗?

我在谷歌上搜索过这个问题,但没有 StackOverflow 和 GitHub 提供帮助。

【问题讨论】:

    标签: node.js postgresql orm sequelize.js


    【解决方案1】:

    这应该有效。 Sequelize 允许您创建别名。 https://sequelize.org/v5/manual/querying.html

    const Sequelize = require('sequelize');
    const op = Sequelize.Op;
    const operatorsAliases = {
        $between: op.between, //create an alias for Op.between
    }
    const connection = new Sequelize(db, user, pass, { operatorsAliases })
    
    
    const dbresp = await Table.findAll({
      attributes: [...],
      where: {
        ...
        createdAt: {
           $between: [new Date(Date(startDate)), new Date(Date(endDate))],
           // same effect
           // $lte: new Date(startDate),
           // $gte: new Date(endDate),
        },
      },
      logging: console.log,
      raw: true,
      order: [['createdAt', 'ASC']],
      // limit: count,
    });
    

    【讨论】:

      【解决方案2】:

      尝试使用下面共享的代码:

      [Op.between]: [date1, date2]
      

      或者原始查询:

      SELECT ...
      FROM table t
      WHERE t.createdAt BETWEEN '2019-02-05' AND '2019-02-07'
      ORDER BY t.createdAt ASC;
      

      【讨论】:

      • 是的,这可能会奏效。但我想弄清楚是什么导致了这个问题:)
      【解决方案3】:

      好的,IDK 是什么导致了这个问题,但我通过像这样使用 Sequelize 的 Op 对象修复了它。

      const Op = require('./models').Sequelize.Op;
      const dbresp = await Table.findAll({
        attributes: [...],
        where: {
          ...
          createdAt: {
             [Op.between]: [startDate, endDate],
          },
        },
        logging: console.log,
        raw: true,
        order: [['createdAt', 'ASC']],
        // limit: count,
      });
      

      似乎 $between 运算符不起作用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-04
        相关资源
        最近更新 更多