获得两个日期间隔在mysql中的所有记录

问题描述 投票:1回答:1

获取两个日期间隔在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
....

请注意以上期望的输出,即使用户未安排任何广告位/时段,我们也需要从开始日期到结束日期的所有日期间隔。如果两个时隙周期重叠,则需要输出中这些时隙的总和。

mysql date redmine
1个回答
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;

如您所见,我也在查询中使用交叉联接,以便一次引入参数。这不是必需的,但是否则您将不得不在查询中多次输入参数日期。

© www.soinside.com 2019 - 2024. All rights reserved.