PostgreSQL中的每日用户数

时间:2018-10-22 18:08:16

标签: postgresql

我有一个看起来像这样的数据库

users
phone        created
8001234578   1540231160
9001234578   1540220360
1001234578   1540144760
2001234578   1540058360

请注意,created列是unix时间戳。

我想按当天创建的用户对他们进行分组,并计算用户数量,因此上述示例数据库应返回类似的内容。

[
  {day: '10/22/2018', count: 2},
  {day: '10/21/2018', count: 1},
  {day: '10/20/2018', count: 1},
]

我尝试学习to_char命令,但我无法弄清楚,这是我尝试过的:

SELECT 
  to_char(created, 'Day') as day,
COUNT(*) as count
FROM users
WHERE created >= ${startDate} AND created <= ${endDate}
GROUP BY to_char(created, 'Day')

它返回了这个:

[{day: ' .ay', count: '4'}]

3 个答案:

答案 0 :(得分:1)

SELECT date_trunc('day', users.created) "day", count(*) as count
FROM users
WHERE created >= ${startDate} AND created <= ${endDate}
GROUP BY 1

答案 1 :(得分:1)

您可以设置日期时间格式,这样您就可以得到结果

postgres# select to_char(now(), 'DD Mon YYYY');
   to_char   
-------------
 22 Oct 2018
(1 row)

在您的情况下查询将是这样

SELECT 
  to_char(created, 'DD Mon YYYY') as day,
COUNT(*) as count
FROM users
WHERE created >= ${startDate} AND created <= ${endDate}
GROUP BY to_char(created, 'DD Mon YYYY')

在这里您可以找到日期时间格式规范itertools.product

答案 2 :(得分:1)

首先,如果它在您的控制范围内,则应考虑使用Postgres的内置TIMESTAMP数据类型,而不是将日期存储为UNIX时间戳。这将使您的查询更加轻松。

话虽如此,如果您坚持使用UNIX时间戳(大概存储为整数),则无论如何都必须将它们转换为TIMESTAMP才能获得所需的内容。您可以使用TO_TIMESTAMP从UNIX时间戳转换,并使用DATE_TRUNC函数仅获取日期部分:

SELECT 
    DATE_TRUNC('day', TO_TIMESTAMP(created)), 
    COUNT(*)
FROM users
GROUP BY DATE_TRUNC('day', TO_TIMESTAMP(created))

当然,如果您将日期存储为Postgres TIMESTAMP,则它是相同的查询,但是更简单:

SELECT 
    DATE_TRUNC('day', created), 
    COUNT(*)
FROM users
GROUP BY DATE_TRUNC('day', created)