[英]get all record between two dates interval in mysql
獲取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
....
資源預訂表:
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;
如您所見,我還在查詢中使用了交叉連接,以便一次性引入參數。 這不是必需的,否則您必須在查詢中多次放置參數日期。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.