2
votes

Requête avec plage de dates à l'aide de la requête Sequelize avec Postgres dans Node

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é.


0 commentaires

3 Réponses :


2
votes

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]


1 commentaires

Ouais, cela fonctionnera probablement. Mais j'aimerais savoir ce qui cause ce problème :)



4
votes

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


0 commentaires

1
votes

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,
});


0 commentaires