如何在Sequelize中按createdAt月份分组统计条目数量?
在Sequelize中按createdAt月份分组统计条目数量
你之前的代码存在两个问题:一是括号不匹配(['MONTH(createdAt')]少了右括号),二是直接将SQL函数作为字符串放入group数组中,Sequelize会将其识别为字段名而非执行函数,导致报错。以下是两种可行的实现方案:
方案一:使用Sequelize内置的fn和col方法(推荐)
这种方式更符合ORM的使用规范,避免直接拼接SQL:
const { fn, col } = require('sequelize'); // 替换为你的实际模型名称 YourModel.findAll({ attributes: [ // 提取createdAt的月份并命名为month [fn('MONTH', col('createdAt')), 'month'], // 统计该月份下的条目数量并命名为count [fn('COUNT', col('id')), 'count'] ], // 按月份分组 group: [fn('MONTH', col('createdAt'))], // 可选:按月份升序排序 order: [[fn('MONTH', col('createdAt')), 'ASC']] }) .then(result => { // 结果会是类似 [{ month: 3, count: 12 }, { month: 5, count: 8 }] 的数组 console.log(result); }) .catch(err => { console.error(err); });
方案二:使用literal直接编写SQL片段
如果更习惯原生SQL写法,可以用literal直接传入SQL函数:
const { literal } = require('sequelize'); YourModel.findAll({ attributes: [ [literal('MONTH(createdAt)'), 'month'], [literal('COUNT(*)'), 'count'] ], group: [literal('MONTH(createdAt)')], order: [[literal('MONTH(createdAt)'), 'ASC']] }) .then(result => { console.log(result); }) .catch(err => { console.error(err); });
补充:按年份+月份分组(避免跨年份同月份合并)
如果需要区分不同年份的同一月份,可以调整分组规则:
// 使用fn方式 [fn('DATE_FORMAT', col('createdAt'), '%Y-%m'), 'year_month'] // 使用literal方式 literal('DATE_FORMAT(createdAt, "%Y-%m")')
内容的提问来源于stack exchange,提问作者Media Foster
相关产品推荐
相关产品推荐

