Ce que j'essaie de faire, c'est d'obtenir des lignes entre deux dates en utilisant Sequelize ORM dans Node.js. J'utilise PostgreSQL. Le problème est que la demande que je fais est mal interprétée par Sequelize.
Voici le code que j'utilise pour faire la demande
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;
En me connectant brut Requête SQL, il est évident que la requête est incorrecte
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, });
Quelle est la bonne façon de faire une telle requête? Dois-je utiliser une requête brute?
J'ai recherché ce problème sur Google, mais aucun StackOverflow ni GitHub ne m'a aidé.
3 Réponses :
Essayez d'utiliser le code partagé ci-dessous:
SELECT ... FROM table t WHERE t.createdAt BETWEEN '2019-02-05' AND '2019-02-07' ORDER BY t.createdAt ASC;
Ou la requête brute:
[Op.between]: [date1, date2]
Ouais, cela fonctionnera probablement. Mais j'aimerais savoir ce qui cause ce problème :)
Ok, IDK ce qui cause ce problème mais je l'ai corrigé en utilisant l'objet Op de Sequelize comme ceci.
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, });
On dirait que l'opérateur $ between ne fonctionne pas
Cela devrait fonctionner. Sequelize vous permet de créer des alias. 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, });