PostgreSQL: количество записей для каждого дня недели с заданным интервалом времени - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь получить количество записей за каждый день с определенным интервалом времени (> = 7:00 понедельника и <7:00 вторника,> = 7:00 вторника и 7 <среды), и паттерн продолжается,Это моя структура таблицы </p>

TABLE Name: test_table
|---------------------|------------------|-------------------------|
|          id         |        name      |        occured_at       |
|---------------------|------------------|-------------------------|

Я могу подсчитать, сколько записей у меня есть за каждый день, используя запрос ниже, но я почти уверен, что он считает только записи между 12 и 23:59 вечерав тот же день.

SELECT COUNT(id),name AS ord_name, date_trunc('day', occured_at) AS ord_date
FROM test_table
GROUP BY ord_name, ord_date
ORDER BY ord_date

Результат:

|count|ord_name|        ord_date      |
|-----|--------|----------------------|
| 20  |  ord1  |2019-02-01 00:00:00+00|
| 25  |  ord1  |2019-02-02 00:00:00+00|
| 30  |  ord1  |2019-02-03 00:00:00+00|
| 15  |  ord1  |2019-02-04 00:00:00+00|

Я также пытался использовать INTERVAL, добавив 24 часа в COLUMN occured_at, но я не смог заставить его работать.

SELECT COUNT(id),name AS ord_name, date_trunc('day', occured_at) AS ord_date
FROM test_table
WHERE ord_date::time >= '07:00:00' + INTERVAL '24 hour'
GROUP BY ord_name, ord_date
ORDER BY ord_date

Пример данных:

| id  |  name  |       occured_at     |
|-----|--------|----------------------|
| 1   |  ord1  |2019-02-01 07:00:00+00|
| 2   |  ord1  |2019-02-01 12:30:00+00|
| 3   |  ord1  |2019-02-02 06:58:00+00|
| 4   |  ord1  |2019-02-02 07:01:00+00|
| 5   |  ord1  |2019-02-03 07:00:00+00|
| 6   |  ord1  |2019-02-04 06:59:00+00|

Ожидаемый результат:

|count |ord_name |ord_date  |
|------|---------|----------|
| 3    |  ord1   |2019-02-01|
| 1    |  ord1   |2019-02-02|
| 2    |  ord1   |2019-02-03|

1 Ответ

0 голосов
/ 12 февраля 2019

Поскольку в этом случае ваш день начинается с 7 утра, вы можете перефразировать даты, вычтя из них 7 часов.Таким образом, дата ровно в 7 часов утра станет началом этого фактического дня.

SELECT
    COUNT(id),
    name AS ord_name,
    date_trunc('day', occured_at - interval '7 hour') AS ord_date
FROM test_table
GROUP BY
    name,
    date_trunc('day', occured_at - interval '7 hour')
ORDER BY
    ord_date;

enter image description here

Демонстрация

...