我有一个看起来像这样的数据库
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'}]
答案 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)