获取两个日期间隔在mysql中的所有记录
我在redmine中有一个user和resource_bookings表。我想记录工作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
....
请注意以上期望的输出,即使用户未安排任何广告位/时段,我们也需要从开始日期到结束日期的所有日期间隔。如果两个时隙周期重叠,则需要输出中这些时隙的总和。
您正在寻找的被称为外部联接。您想要显示给定时间段内所有用户的日期,但是当他们没有日期时仍显示用户。
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;
如您所见,我也在查询中使用交叉联接,以便一次引入参数。这不是必需的,但是否则您将不得不在查询中多次输入参数日期。