You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 20:10:25