Как сгруппировать результаты суммирования по дате с произвольным временем запуска PostrgresQL - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь сгруппировать результаты сумм по индивидуальным дням в Postgresql. Поскольку обычный день начинается в 00:00, я бы хотел, чтобы мой начался в 04:00, поэтому, если есть запись со временем 2019-01-03 02:23, она будет считаться «2019-01-02».

Прямо сейчас мой код выглядит следующим образом: нижняя часть отлично работает при типе дня 00:00 - 23.59, однако я хотел бы сгруппировать его по верхнему диапазону, созданному выше. Я просто не знаю, как соединить эти две части.

with dateRange as(
SELECT
generate_series(
MIN(to_date(payments2.paymenttime,'DD Mon YYYY')) + interval '4 hour',
max(to_date(payments2.paymenttime,'DD Mon YYYY')),
'24 hour') as theday
from payments2
)

select 
sum(cast(payments2.servicecharge as money)) as total,
to_date(payments2.paymenttime,'DD Mon YYYY') as date
from payments2
group by date

Результат, подобный этому

+------------+------------+
|    total   |    date    |
+------------+------------+
|     20     | 2019-01-01 |
+------------+------------+
|     60     | 2019-01-02 |
+------------+------------+
|     35     | 2019-01-03 |
+------------+------------+
|     21     | 2019-01-04 |
+------------+------------+

Большое спасибо за вашу помощь.

1 Ответ

1 голос
/ 02 апреля 2020

Если я не неправильно понял ваш вопрос, вам просто нужно вычесть 4 часа из отметки времени перед приведением к дате, вам даже не нужен CTE.

Что-то вроде

select 
sum(cast(payments2.servicecharge as money)) as total,
(to_timestamp(payments2.paymenttime,'DD Mon YYYY HH24:MI:SS') - interval '4 hours')::date as date
from payments2
group by date

Ю может понадобиться использовать другой формат в функции to_timestamp в зависимости от формата строки payments2.paymenttime

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...