MySQL создание настраиваемого диапазона дат для ежедневных отчетов - PullRequest
0 голосов
/ 06 августа 2020

MySql 8.0

У меня есть набор данных, который выглядит примерно так:

user_id        transaction_time      item_price
   1          2020-01-01 13:00:00       100 
   1          2020-01-01 18:00:00       100 
   1          2020-01-01 19:00:00       100 
   1          2020-01-01 23:00:00       100 
   1          2020-01-02 04:00:00       100 
   1          2020-01-02 09:00:00       100 

Обычно, если я хочу найти сумму (цену) для дневной цены, я бы сделал

select date(transcation_time) as dt
     , sum(item_price) as sum_price
from table
group by date(transaction_time)

, который выведет

   dt       sum_price
2020-01-01     400
2020-01-02     200

Но вместо 2020-01-01 суммирования цены от 2020-01-01 00:00:00 до 2020-01-01 23:59:59 я хочу суммировать цены от 2020-01-01 18:00:00 до 2020-01-02 06:00:00, что будет помечено как 2020-01-01

так что

2020-01-01   sums prices from 2020-01-01 18:00:00 ~ 2020-01-02 06:00:00 
2020-01-02   sums prices from 2020-01-02 18:00:00 ~ 2020-01-03 06:00:00 
2020-01-03   sums prices from 2020-01-03 18:00:00 ~ 2020-01-04 06:00:00

и так далее ...

тогда полученное агрегирование будет выглядеть так:

   dt       sum_price
2020-01-01     500
2020-01-02     100

обратите внимание, что первая строка не добавляется, так как 13:00:00 не в 18:00:00 ~ 06: 00: 00

Как я могу это сделать?

1 Ответ

1 голос
/ 06 августа 2020

Я думаю, вы просто хотите вычесть 6 часов - или добавить 18 часов:

select date(transaction_time + interval -6 hour) as dt,
       sum(item_price) as sum_price
from table
group by dt;

Если вам действительно нужно только 12 часов, добавьте предложение where:

select date(transaction_time + interval -6 hour) as dt,
       sum(item_price) as sum_price
from table
where time(transaction_time) >= '18:00:00' or
      time(transaction_time) < '06:00:00' 
group by dt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...