Chia 1 record thành nhiều record thoả mãn các ràng buộc về thời gian

Em chào mọi người, em có một vấn đề về SQL muốn tham khảo ý kiến từ các Anh/Chị/Bạn.
Đầu tiên, em có 1 bảng lưu thông tin về OT của nhân viên với cấu trúc như bên dưới.

id id_staff working_date start_time end_time
1 1 2022-04-01 21:00:00 23:00:00
2 1 2022-04-02 04:00:00 08:00:00
3 1 2022-04-03 20:00:00 01:00:00

Tiếp theo, em có 1 bảng lưu thông tin về quy định Ca OT ( gồm Ca ngày , Ca đêm )

id shift_name start_time end_time
1 Day shift 06:00:00 22:00:00
2 Night shift 22:00:00 06:00:00

Em muốn chia dữ liệu của các record trong bảng OT thành nhiều record mới thoả mãn điều kiện start_time -> end_time không được vượt quá range của Ca OT. Kết quả thể hiện như bên dưới:

id id_staff working_date start_time end_time
1 1 2022-04-01 21:00:00 22:00:00
2 1 2022-04-01 22:00:00 23:00:00
3 1 2022-04-02 04:00:00 06:00:00
4 1 2022-04-02 06:00:00 08:00:00
5 1 2022-04-03 20:00:00 00:00:00
6 1 2022-04-03 00:00:00 01:00:00

Trên google có nhiều tài liệu tương tự, tuy nhiên lại ràng buộc đơn giá trị, vấn đề của em đang là dữ liệu ràng buộc lại nằm ở bảng khác.
Mong mọi người giúp đỡ,em cảm ơn mọi người nhiều ạ

cái này bạn cần viết 2 câu sql

  1. câu sql lọc ra overtime - day shift
  2. cây sql lọc ra overtime - night shift

sau đó dùng union

staff id 1 có thời gian từ 21h-23h
với câu 1 thì bạn sẽ tính ra được OT từ 21h-22h là max(work.start_time, shift.start_time) - min(work.end_time, shift.end_time)
với câu 2 thì bạn sẽ tính ra được OT từ 22h-23h, bạn tự fill công thức

max/min được compare theo đúng thời gian chứ không dùng so sánh chuỗi được, ví dụ như 1h sáng với 18h tối thì cái nào lớn hơn cái nào cũng tuỳ theo cái nào là thời gian bắt đầu, 1h sáng của hôm sau nay 1h sáng cùng ngày với 18h tối
ví dụ 1h sáng với 22h như trên thì 1h sáng lớn hơn, nên dùng hàm max chắc không được, bạn cần tự xử chỗ này)

bạn có thể nghiên cứu keyword overlap để dùng cho điều kiện where…

5 Likes

Cảm ơn bạn nhiều, để mình thử phương án bạn đề xuất.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?