javascript - 如何按 createdAt 列的日期部分分组?
问题描述
我正在尝试使用 Sequelize 获取一些小计,这就是我的查询的样子。
const getAllCustomerEarnings = async (customerAccountId) => {
return await customerEarnings.findAll({
attributes: [
[Sequelize.fn('SUM', Sequelize.col('amount')), 'amount'],
[Sequelize.fn('date_trunc', 'day', Sequelize.col('createdAt')), 'createdAt'],
],
where: {
[Op.and]: [
{customerAccountId: customerAccountId},
]
},
order: [['createdAt', 'ASC']],
group: 'createdAt'
})
}
但是,我得到的输出不是每天的小计。我实际上从表中获取了每条记录,时间部分设置为 00:00:000Z
为了获得每天的小计,我应该改变什么?
解决方案
我想我自己找到了解决方案......
上面引用的方法产生以下 SQL 查询
SELECT SUM("amount") AS "amount", date_trunc('day', "createdAt") AS "createdAt"
FROM "CustomerEarnings" AS "CustomerEarning"
WHERE ("CustomerEarning"."customerAccountId" = 5)
GROUP BY "createdAt"
ORDER BY "CustomerEarning"."createdAt" ASC;
这里的问题是,虽然我从 createdAt 列中选择“createdAt”作为截断值的别名,但 Sequelize 仍然引用表中的 createdAt 列,而不是别名。
我通过将别名重命名为“createdOn”来解决这个问题,就像这样
const getAllCustomerEarnings = async (customerAccountId) => {
return await customerEarnings.findAll({
attributes: [
[Sequelize.fn('SUM', Sequelize.col('amount')), 'amount'],
[Sequelize.fn('date_trunc', 'day', Sequelize.col('createdAt')), 'createdOn'],
],
where: {
[Op.and]: [
{customerAccountId: customerAccountId},
]
},
order: [[Sequelize.literal('"createdOn"'), 'ASC']],
group: 'createdOn'
})
}
请注意,我还必须使用
[[Sequelize.literal('"createdOn"'), 'ASC']],
在 order 子句中,而不仅仅是使用别名。那是因为 Sequelize 不断将 order 子句中 alias 列的大小写更改为“createdon”...
希望这可以帮助某人。
推荐阅读
- sql - 如果行名称重复,则仅返回具有重复名称的行
- python - 文件夹被解释为文件
- java - 装箱值被取消装箱,然后立即重新装箱 - Double
- c# - 在线程中解码连续的数据流而不阻塞接收器
- ionic3 - 在滚动事件上将 scrollTop 传递给离子组件
- ios - UITableView 单元格上的 NSContiguousString 泄漏
- javascript - Google 在 World Cup Pin It Live 工具中使用了哪些 JavaScript、HTML、API?
- javascript - 试图在 javascript / jquery 中创建“停止计时器”
- ibm-cloud-private - ICP - 添加以 ECONNREFUSED 结尾的 ldap
- google-chrome - 我可以判断警报/确认是否已被用户或过分热心的广告块驳回?