otoman Posted July 18, 2009 Report Share Posted July 18, 2009 Uzdevums būtu apmēram tāds - noskaidrot, vai gada laikā (piem., 2008.g.) ir vismaz 1 diena, kad cilvēks X nav strādājis, pieņemot, ka vienlaicīgi var darīt N darbus. Piem., Cilvēks Darbs No Līdz ------------------------------------ Jānis Sētnieks 2007-01-01 2008-05-10 Jānis Skolotāj 2008-03-01 2008-11-01 Jānis Direktors 2008-10-02 2009-02-02 Kārlis Šoferis 2007-05-05 2008-05-05 Kārlis Pārdevējs 2008-02-06 2008-07-10 Kārlis Policists 2008-07-15 NULL Piezīme, ja beigu datums ir NULL, tad cilvēks joprojām strādā konkrēto darbu. Tātad secinājums būtu apmēram tāds: Jānis ir strādājis visu 2008. gadu (no 2007-01-01 līdz 2009-02-02). Kārlis nav strādājis visu 2008. gadu (no 2007-05-05 līdz 2008-07-10 strādājis kā šoferis&pārdevējs; no 2008-07-10 līdz 2008-07-15 nav strādājis; no 2008-07-15 līdz šodienai strādā kā policists). Un rezulātā vajadzētu iegūt: Cilvēks Stradajis_visu_gadu ------------------------ Jānis 1 Kārlis 0 Quote Link to comment Share on other sites More sharing options...
Grey_Wolf Posted July 18, 2009 Report Share Posted July 18, 2009 varu ieteikt tikai parlasi .. tas ir : 1. skatamies vai kaads no datumiem nav lielaks no Dotas atskaites punkta : piemeram parbaudam vai strada no gada sakuma .. skatamies vai visnh nav uzsacis darbu velak (kaa sakuma datums) --> ir uzsacis talak nelasam .. 2. konstatejam vai cilveks sobriid vispar straadaa --> nestraada taaatd talak nemaz nelasam .. (nav NULL) 3. talak jau ielasam datumus un skatamies vai tie 100% parklajas, ja neparklajas taaatd kaada diena starpaa... Stipri aptuvens gan tas algoritms, bet atri skatot citu izeju neredzu kaa vie sada veida parlasi .. Quote Link to comment Share on other sites More sharing options...
endrju Posted July 21, 2009 Report Share Posted July 21, 2009 Kādā veidā Tu gribi to atrisināt? Ar SQL, PHP vai ko citu? Quote Link to comment Share on other sites More sharing options...
Aleksejs Posted July 21, 2009 Report Share Posted July 21, 2009 Manuprāt, ir jāatrod visi tie ieraksti, kuriem starp "lidz" un nākamo mazāko "no" ir vairāk par 1 dienu - ja tādi ir atrasti, tātad cilvēks nav kādu brīdi intervālam pa vidu strādājis, tad vēl jānoskaidro par intervāla sākuma un beigu posmiem. tātad kaut kas šāds: SELECT COUNT(t1.cilveks) AS nestradato_intervalu_skaits FROM tabula AS t1 WHERE darbinieks = ID AND ((t1.no >= SAKUMS AND (t1.lidz <= BEIGAS OR t1.lidz IS NULL) AND DATE_ADD(t1.lidz, INTERVAL DAYS 1) < ( SELECT MIN(t2.no) FROM tabula AS t2 WHERE t2.no >= t1.lidz) ) OR (t1.no IN ( SELECT MIN(t3.no) FROM tabula AS t3 WHERE t3.no > SAKUMS ) AND DATE_SUB(t1.no, INTERVAL DAYS 1) > ( SELECT MAX(t4.lidz) FROM tabula AS t4 WHERE t4.lidz <= t1.no) ) OR (t1.lidz < BEIGAS AND t1.no IN ( SELECT MAX(t5.no) WHERE t5.no < BEIGAS ) )) Vienīgi.... nez vai darbojas šāda salīdzināšana a < (select min(b)) - bet nu, ja tas nedarbojas, tad jāpadomā, kā uzrakstīt citādi. Varētu vēl mēģināt pārrakstīt: ... DATE_ADD(t1.lidz, INTERVAL DAYS 1) < ( SELECT MIN(t2.no) FROM tabula AS t2 WHERE t2.no >= t1.lidz ) ... par 0 NOT IN ( SELECT DATEDIFF(MIN(t2.no), DATE_ADD(t1.lidz, INTERVAL DAYS 1)) FROM tabula AS t2 WHERE t2.no >= t1.lidz ) Cerams, ka galīgi šķērsām neuzrakstīju. Katrā gadījumā interesanti galvu palauzīt. :) Cits jautājums, vai šis ir optimālākais vaicājums un kādos gadījumos prātīgāk būtu to darīt ar PHP līdzekļiem. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.