Количество ежедневных пользователей в PostgreSQL - PullRequest
0 голосов
/ 22 октября 2018

У меня есть база данных, которая выглядит следующим образом

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 голосов
/ 22 октября 2018

Вы можете установить формат даты и времени, чтобы вы получили такой результат

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')

Здесь вы можете найти спецификацию формата даты и времени https://www.postgresql.org/docs/9.6/static/functions-formatting.html#FUNCTIONS-FORMATTING-DATETIME-TABLE

0 голосов
/ 22 октября 2018

Во-первых, если это находится под вашим контролем, вам следует рассмотреть возможность использования встроенного в 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))

Конечно, если вы храните даты как PostgresTIMESTAMP, это тот же запрос, но проще:

SELECT 
    DATE_TRUNC('day', created), 
    COUNT(*)
FROM users
GROUP BY DATE_TRUNC('day', created)
0 голосов
/ 22 октября 2018
SELECT date_trunc('day', users.created) "day", count(*) as count
FROM users
WHERE created >= ${startDate} AND created <= ${endDate}
GROUP BY 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...