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