我有一个与下表类似的表格。我正在尝试查找今天所有价格的总和。
| 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语句如下。
执行(默认):选择sum(`price`)AS`sum` from`orders` AS`orders` whereorders`orders.`created` ='2019-05-27 18:30:00'; < / p>
答案 0 :(得分:1)
这里发生的是您正在比较精确的时间戳,例如'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允许您截断特定的时间间隔。因此,您可以调用sequelize.fn()
方法来使用创建可以调用read more in this link的'date_trunc'查询。像这样:
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
答案 1 :(得分:1)
添加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);
答案 2 :(得分:0)
使用时刻会更容易
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);
答案 3 :(得分:0)
您可以使用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);