NodeJS 如何获取今天的sequelize js记录

mgdq6dx1  于 2022-11-03  发布在  Node.js
关注(0)|答案(6)|浏览(174)

我有一个类似下表的表。我试图找到今天所有价格的总和。

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

下面的代码是我想出的,但它似乎不工作。

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

SUM的值为0,即使今天有条目。我也尝试了以下方法,但也没有效果。

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

在终端上查询的SQL语句如下。
正在执行(预设):SELECT sum(“price”')AS“sum”FROM“' orders”AS“'orders”WHERE“' orders”'.创建时间= '2019-05-27 18:30:00 ';

qgzx9mmu

qgzx9mmu1#

这里所发生的是,您正在比较精确的时间戳,例如'2019-05-27 11:40:48'等于'2019-05-27 18:30:00'。因此,这种比较永远不会给您结果,因为即使是同一天(5月27日),但时间是不同的。
所以这里你有一个可能的解决方案。

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

您需要创建如下查询:created < [NOW] AND created > [TODAY_START]**为什么?**因为您将获得NOW之后登记的所有价格的总和。此代码还将帮助您获得一系列日期的总和。

PostgreSQL的替代方案

注意PostgreSQL允许你截断到特定的时间间隔。所以,你可以调用sequelize.fn()方法来创建一个调用'date_trunc'的查询,你可以read more in this link。如下所示:

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

另外,请记住更新到latest version

npm i sequelize@5.8.6 --s
tgabmvqs

tgabmvqs2#

获取今日记录的最佳方法。

const op = sequelize.Op;
      const moment = require('moment');
      const TODAY_START = moment().format('YYYY-MM-DD 00:00');
      const NOW = moment().format('YYYY-MM-DD 23:59');

      const todaysRecord = await OrdersModel.findAll({

                where: {
                    createdAt: {
                        [op.between]: [
                            TODAY_START,
                            NOW,
                        ]
                    }
                }
            });
iyfjxgzm

iyfjxgzm3#

我们也可以使用[op.between],它将获取两个给定日期范围之间的数据。因此,如果我们给出今天的开始时间和当前时间,它将给出今天的数据。

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

where: {
createdAt: {
    [Op.between]: [START.toISOString(), NOW.toISOString()]
  }
}

快乐编码...

fcwjkofz

fcwjkofz4#

添加DATE FUNCTION以进行日期比较,而不考虑时间

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);
js5cn81o

js5cn81o5#

使用矩会更容易

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);
2wnc66cl

2wnc66cl6#

您可以使用Sequelize.literal

const { Op } = Sequelize;
    const options = {
        where: {}
    };

    options[Op.and] = [
        sequelize.where(Sequelize.literal('DATE(created) = CURDATE()'))            
    ] 

    const SUM = await OrdersModel.sum('price', options);
    console.log(SUM);

如果没有未来日期,您可以按如下方式查询:

options[Op.and] = [
        sequelize.where(sequelize.col('created'), {
            [Op.gt]: Sequelize.literal('DATE_SUB(CURDATE(), INTERVAL 1 DAY)')
        })            
    ]
    const SUM = await OrdersModel.sum('price', options);
    console.log(SUM);

相关问题