使用带有Postgres的Sequelize请求在Node中查询日期范围

时间:2019-02-05 21:47:09

标签: node.js postgresql orm sequelize.js

我想做的是通过使用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都提供了帮助。

3 个答案:

答案 0 :(得分:1)

好吧,IDK会导致此问题,但我通过使用Sequelize的Op对象来解决此问题。

@import 'client-krstycrab'

似乎 $ between 运算符不起作用

答案 1 :(得分: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 :(得分:0)

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

[Op.between]: [date1, date2]

或原始查询:

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