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';
3 Réponses :
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.
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);
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.
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);
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'): {
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);
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.