1
votes

Comment récupérer les enregistrements JS de Sequelize pour aujourd'hui

J'ai un tableau qui ressemble au tableau ci-dessous. J'essaie de trouver la somme de tous les prix pour AUJOURD'HUI.

const TODAY = new Date();
const SUM = await OrdersModel.sum('price', {
    where: {
      created: Sequelize.DATE(TODAY),
    },
});
console.log(SUM);

Le code ci-dessous est ce que j'ai trouvé mais il ne semble pas fonctionner.

const TODAY = new Date();
const SUM = await OrdersModel.sum('price', {
    where: {
      created: TODAY,
    },
});
console.log(SUM);

La valeur de SUM est 0 même s'il existe des entrées pour aujourd'hui. J'ai également essayé ce qui suit mais cela n'a pas fonctionné non plus.

| id| price |       created        |
|---|-------|----------------------|
| 0 |  500  | 2018-04-02 11:40:48  |
| 1 | 2000  | 2018-04-02 11:40:48  |
| 2 | 4000  | 2018-07-02 11:40:48  |

L'instruction SQL interrogée sur le terminal est la suivante.

Exécution (par défaut): SELECT sum (`price`) AS` sum` FROM `orders` AS` orders` WHERE `orders`.`created` = '2019-05-27 18:30:00';


1 commentaires

J'ai mis à jour la solution pour que vous n'ayez pas de problèmes, si vous pensez que c'est la solution, veuillez marquer votre question comme réponse.


3 Réponses :


5
votes

Ce qui se passe ici, c'est que vous comparez des horodatages exacts tels que '2019-05-27 11:40:48' égal à '2019-05-27 18:30: 00 '. Donc cette comparaison ne vous donnera jamais de résultat car même si c'est le même jour (27 mai) mais l'heure est différente.

Vous avez donc ici une solution possible.

npm i sequelize@5.8.6 --s

Vous devez créer une requête comme celle-ci: créé [TODAY_START] Pourquoi? car vous obtiendrez la somme de tous les prix enregistrés après MAINTENANT . Ce code vous aidera également à obtenir le total d'une plage de dates.

Alternative pour PostgreSQL

Notez que PostgreSQL vous permet de tronquer à des intervalles spécifiques. Ainsi, vous pouvez appeler la méthode sequelize.fn () pour créer une requête qui appelle 'date_trunc' vous pouvez en savoir plus dans ce lien . Comme ceci:

const SUM = await OrdersModel.sum('price', {
    where: {
      sequelize.fn('CURRENT_DATE'): {
        [Op.eq]:  sequelize.fn('date_trunc', 'day', sequelize.col('created'))
      }
    },
});
console.log(SUM);

Pensez également à mettre à jour le dernière version :

const Op = Sequelize.Op;
const TODAY_START = new Date().setHours(0, 0, 0, 0);
const NOW = new Date();

const SUM = await OrdersModel.sum('price', {
    where: {
      created: { 
        [Op.gt]: TODAY_START,
        [Op.lt]: NOW
      },
    },
 });
 console.log(SUM);


6 commentaires

Salut, j'obtiens toujours le SUM à 0 et il n'y a aucun changement dans la requête SQL exécutée sur le terminal.


Hé essayez avec moins que pour voir ce que vous obtenez probablement l'erreur est dans une autre partie


Op.lt donne une valeur. Cependant, cela donne la somme pour toutes les dates précédentes.


Alors essayez cette alternative, je pense que je sais ce qui se passe. Comparez-vous les horodatages exacts? comme '2019-05-27 11:40:48' égal à '2019-05-27 18:30:00' cette comparaison ne vous donnera jamais de résultat car c'est le même jour (27 mai) mais l'heure est différente.


Oui, j'ai essayé d'utiliser Op.gt et d'utiliser la date d'aujourd'hui et de changer l'heure à minuit. Ça marche.


Vérifiez l'explication pour laquelle j'utilise gt et lt et j'ai corrigé mon erreur. Je change de gt avec lt . Maintenant fonctionnera très bien.



1
votes

Ajoutez la FONCTION DATE pour effectuer une comparaison de date sans tenir compte de l'heure

const TODAY = new Date();
const SUM = await OrdersModel.sum('price', {
    where: {
      sequelize.fn('CURRENT_DATE'): {$eq:  sequelize.fn('date_trunc', 'day', sequelize.col('created'))}
    },
});
console.log(SUM);


5 commentaires

Salut qu'entendez-vous par ajouter la fonction DATE?


en utilisant la fonction DATE, vous comparerez avec la valeur de la date et elle ignorera les valeurs hh: mm: ss


est-ce une fonction personnalisée que je devrais écrire ou une partie de sequelize?


Référez-vous au code mis à jour dans les sections de commentaires, c'est une fonction intégrée sequelize.fn ('date_trunc', 'day', sequelize.col ('yourdatefiled')). Donc, il ne considérera que la partie de la date


Vous ne pouvez pas utiliser une fonction une clé d'objet, cela provoquera une erreur. SyntaxError: jeton inattendu '.' sequelize.fn ('CURRENT_DATE'): {



0
votes

Utiliser moment serait plus facile

const moment = require('moment');
const Op = require('sequelize').Op;
const SUM = await OrdersModel.sum('price', {
    where : {
                created_at : { [Op.gt] : moment().format('YYYY-MM-DD 00:00')},
                created_at : { [Op.lte] : moment().format('YYYY-MM-DD 23:59')}
            },
});
console.log(SUM);


0 commentaires