Shartlari bilan örtüşen vaqt oralig'ini oling

Vazifalarni rejalashtirishga harakat qilaman, lekin nima qilish kerakligini yoki qanday qilib hal qilishni bilmayotgan bir muammo bilan kurashdim: S

Men imkon qadar yaxshi tushuntirishga harakat qilaman. Quyidagi kabi jadval berilgan:

key | start |  end  | employee(fk) 
 1    6:00    8:00     A               
 2    9:00    11:00    B
 3    7:00    9:00     B
 4    7:00    11:00    C

in image

Men topmoqchi bo'lgan narsalar, N xodimlarining to'plamini hisobga olgan holda, menga berilgan xodimlar tomonidan barcha kelishilgan vaqt oralig'ini qaytarib beradi. bu kabi xodimlarning "AND'ed" qatoriga kirishga o'xshaydi. (yoki boshqa so'z bilan aytganda: barcha xodimlar ishlaydigan barcha vaqt oralig'ini oling)

Misol:

given {A,B}   returns 2 columns 7:00  |  8:00  time range which overlaped by A and B
given {B,C}  returns  2 columns 9:00  |  11:00  time range which overlaped by B and C

Men 3 kundan beri o'ylayapman va nima qilish kerakligini juda aniq tasavvur qila olmayman ... Kimdir menga yordam berishi mumkin?

1
Sizga nimaga muhtojlik kerak? Yarim soat? Bir soat? Bir daqiqa?
qo'shib qo'ydi muallif Jack, manba
ha, shuning uchun ko'p narsalarni qilish kerak emasligiga amin bo'lgan narsalarni osongina ajratib qo'ying
qo'shib qo'ydi muallif Jack, manba
yarim soat yaxshi bo'ladi, biroq bu narsa ta'sir qiladimi?
qo'shib qo'ydi muallif Kossel, manba

2 javoblar

Sizning tanqisligingiz etarlicha qo'pol ekan, siz 30 daqiqagacha qadam tashlab, har bir ishchining ish bilan bandligini tekshirishingiz mumkin.

Siz bir qator boolean qadriyatlarni saqlab qolishingiz mumkin, har bir xodim uchun, bu ishchi hozirgi vaqtda band bo'lganligini bildiradi.

Keyin 30-daqiqada qadam bosishingiz mumkin (keling, 6-yildan boshlab):

  1. o'zingizning faolligingizga mos keladigan har bir boshlang'ich amal uchun
    0
Siz barcha faoliyatni aniq tekshirishingiz kerak bo'ladi. Ma'lumotlarni to'g'ridan-to'g'ri ishlatish oson kechadi: ularni faqat 30 daqiqagacha bosqichma-bosqich olib borishga majbur qilmasdan ularni to'g'ri tartibda saqlab turish uchun saqlab qo'ying (har kim o'z faoliyatini boshlaganida yoki faoliyatini to'xtatadi), lekin so'rovlar bilan Tezkor yo'l bor, deb o'ylayman. Albatta, murakkab operatsiya qilish kerak.
qo'shib qo'ydi muallif Jack, manba
ammo har 30 daqiqada tekshiradigan juda ko'p jarayon emasmi? chunki men faqat bir kunlik vaqt oralig'ini olishni istamasligim kerak, agar imkon bo'lsa kamida 3 oy yoki 1 yil vaqt oralig'iga ehtiyojim bor.
qo'shib qo'ydi muallif Kossel, manba

Buni psuedo-SQLda hal qiladimi yoki yo'qmi (men o'z kompaniyamning uy sharoitida yaratilgan JB-dan foydalanaman, shuning uchun bizning SQL-sintaksimdan foydalaning). Jadval nomini "jadval" deb hisoblasangiz:

SELECT T1.employee, T2.employee, T1.start, T2.end 
FROM Table T1, Table T2 
WHERE T1.key!=T2.key AND T1.employee!=T2.employee 
      AND T1.start <= T2.end AND T1.start >= T2.start
0
qo'shib qo'ydi