PostgreSQL - 按时间戳值分组?
Posted
技术标签:
【中文标题】PostgreSQL - 按时间戳值分组?【英文标题】:PostgreSQL - GROUP BY timestamp values? 【发布时间】:2011-10-13 12:54:54 【问题描述】:我有一张表,其中存储了采购订单。每行都有一个时间戳,指示下订单的时间。我希望能够创建一份报告,表明每天、每月或每年的购买次数。我想我会做一个简单的 SELECT COUNT(xxx) FROM tbl_orders GROUP BY tbl_orders.purchase_time 并获取值,但事实证明我不能 GROUP BY 时间戳列。
还有其他方法可以做到这一点吗?理想情况下,我想要一个灵活的解决方案,这样我就可以使用我需要的任何时间范围(每小时、每月、每周等)。感谢您提供的任何建议!
【问题讨论】:
当您尝试按时间戳列分组时会出现什么错误?它似乎在这里工作正常,请记住时间戳必须相同(精确到微秒,或任何最小分辨率)才能被分组。 【参考方案1】:没有 date_trunc 函数就可以解决问题(更容易阅读)。
// 2014
select created_on::DATE from users group by created_on::DATE
// updated September 2018 (thanks to @wegry)
select created_on::DATE as co from users group by co
我们在这里所做的是将原始值转换为 DATE,从而使该值中的时间数据变得无关紧要。
【讨论】:
正是我想要的,转换为“2016-06-27”之类的日期,易于快速计算(*)按天 我认为将时间戳类型转换为 DATE 在 Group By 中不起作用,因为它不适合我。 @hky404 我让它在选择中使用别名,然后在 GROUP BY 中使用该别名。select created_on::DATE as co from users group by co
@wegry 谢谢!我用您的解决方案更新了答案。我猜 Postgres 在我发布后的 5 年内更新了。
月份和年份的工作原理是什么?它抛出了一个错误时间戳::月【参考方案2】:
在这里按时间戳列分组对我来说很好,请记住,即使是 1 微秒的差异也会阻止两行被分组在一起。
要按较大的时间段进行分组,请按时间戳列上返回适当截断值的表达式进行分组。 date_trunc
在这里很有用,to_char
也可以。
【讨论】:
date_trunc 函数正是我想要的。谢谢!以上是关于PostgreSQL - 按时间戳值分组?的主要内容,如果未能解决你的问题,请参考以下文章