получить всю запись между двумя датами в mysql - PullRequest
2 голосов
/ 27 января 2020

получить все записи между двумя интервалами дат в mysql

У меня есть таблицы user и resource_bookings в redmine. Я хочу получить учет пользователей, которые работают 8 часов, менее 8 часов, 0 часов и более 8 часов между двумя заданными датами на основе периода дат.

Таблица пользователей:

id  firstname   lastname    status  type
1   Ankur       Mishra      1       user
2   Anil        Chauhan     1       user
3   Jitendra    Singh       1       user
....

таблица resource_bookings:

id  project_id  user_id   start_date                end_date              hours_per_day
1   363         3         2019-09-13 00:00:00       2019-10-31 00:00:00   4 
2   350         3         2019-09-01 00:00:00       2019-11-30 00:00:00   6 
3   316         260       2020-01-01 00:00:00       2020-02-31 00:00:00   8.5 
....

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

Когда пользователь выбирает дату начала '2019-08-01' и дату окончания '2020-02-01', ожидается Выход выглядит следующим образом:

id  user_id   user_name       start_date       end_date     hours_per_day
1   1         Ankur Mishra    2019-08-01       2020-02-01   0 
2   2         Anil Chauhan    2019-08-01       2020-02-01   0 
3   3         Jitendra Singh  2019-08-01       2019-08-31   0
4   3         Jitendra Singh  2019-09-01       2019-09-12   6
5   3         Jitendra Singh  2019-09-13       2019-10-31   10
6   3         Jitendra Singh  2019-11-01       2019-11-30   6
7   3         Jitendra Singh  2019-12-01       2020-02-01   0
....

Обратите внимание, что в приведенном выше ожидаемом выводе нам нужны все интервалы дат от начальной до конечной даты, даже если пользователь не запланирован на какой-либо слот / период. И если два интервала времени перекрываются, нам нужна сумма этих интервалов в выводе.

1 Ответ

0 голосов
/ 27 января 2020

То, что вы ищете, называется external join . Вы хотите показать всем пользователям их даты за указанный период, но по-прежнему показывать пользователям, когда у них нет даты в течение.

select
  u.id,
  u.first_name,
  u.last_name,
  coalesce(rb.start_date, param.start_date) as start_date,
  coalesce(rb.end_date, param.end_date) as end_date,
  coalesce(rb.hours_per_day, 0) as hours_per_day
from (select date '2019-08-01' as start_date, date '2020-02-01' as end_date) param
cross join user u
left join resource_bookings rb on rb.user_id = u.id 
                              and rb.start_date <= param.end_date
                              and rb.end_date >= param.start_date
order by u.id, rb.id;

Как вы видите, я также использую перекрестное объединение в мой запрос, чтобы ввести параметры один раз. В этом нет необходимости, но в противном случае вам придется указывать даты параметра несколько раз в запросе.

...