按日期继续分组,忽略 hours/minutes/seconds

Sequelize grouping by date, disregarding hours/minutes/seconds

嘿,所以我正在尝试使用 Sequelize(Node.js ORM for postgreSQL)从数据库中查询,我正在尝试按日期范围分组,并计算其中有多少项目 table.

现在我的密码是

 Task.findAll({
    attributes: ['createdAt'],
    group: 'createdAt'
  })

但是如您所见,分组仅考虑确切的日期(包括秒数),因此分组实际上毫无意义,因为无论如何都不会有重叠的项目具有完全相同的秒数。 所以我希望它只是基于日、年和月进行分组。

我假设它必须像 sequelize.fn(...)

按照你说的,用sequelize.fn(...)搞定了,没有别的办法了。尝试:

Task.findAll({
  group: [sequelize.fn('date_trunc', 'day', sequelize.col('createdAt'))]
})

我认为这可以完成这项工作。如果没有,我们将看看如何做 ;)

请注意,PostgreSQL 允许您截断到特定的时间间隔。如需更多信息,请访问:http://www.postgresql.org/docs/9.1/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC

此外,要了解组(和顺序)的工作原理,请参阅 Sequelize 的文档:https://github.com/sequelize/sequelize/blob/172272c8be9a847b2d64f0158826738703befddf/docs/docs/models-usage.md#manipulating-the-dataset-with-limit-offset-order-and-group

你也可以试试:

     group:'DATE(date_added)' 
     or
     group:'WEEK(date_added)'
     or
     group:'MONTH(date_added)'

尽管您必须设置 sql_mode = "",否则会出现 ONLY_FULL_GROUP_BY 错误。

所选答案在这里无效。

这对我有用。

Task.findAll({
    attributes: [
        [Sequelize.literal(`DATE("createdAt")`), 'date'],
        [Sequelize.literal(`COUNT(*)`), 'count']
    ],
    group: ['date'],
})

对于续集和MYSQL

这对我有用:

Model.findAll({
      attributes: [
        /* add other attributes you may need from your table */
        [sequelize.fn('DATE', sequelize.col('createdAt')), 'Date']
      ],
      group: [sequelize.fn('DATE', sequelize.col('createdAt')), 'Date']
    })