按日期对小组进行分组,忽略小时/分钟/秒

rep*_*epo 7 javascript sql postgresql node.js sequelize.js

嘿所以我试图从数据库查询,使用Sequelize(Node.js ORM for postgreSQL),我试图按日期范围分组,并保持该表中的项目数量的计数.

现在我的代码是

 Task.findAll({
    attributes: ['createdAt'],
    group: 'createdAt'
  })
Run Code Online (Sandbox Code Playgroud)

但是你可以看到分组只考虑确切的日期(包括秒),因此分组实际上是没有意义的,因为无论什么都没有重叠的项目与完全相同的第二个计数.所以我希望它只是基于日,年和月的小组.

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

bar*_*ity 13

正如你所说,它完成了sequelize.fn(...),没有别的办法.尝试:

Task.findAll({
  group: [sequelize.fn('date_trunc', 'day', sequelize.col('createdAt'))]
})
Run Code Online (Sandbox Code Playgroud)

我认为这可能会起到作用.如果没有,我们会看到如何做到这一点;)

请注意,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偏移阶和分组

  • @barbarity 当你想用特定的时区截断时你会怎么做? (2认同)

小智 8

选择的答案在这里不起作用。

这就是对我有用的东西。

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

  • MariaDB 想要不带引号的字段名... ` [Sequelize.literal(`DATE(createdAt)`), 'date']` (3认同)