Jump to content
php.lv forumi

Laika intervāla pārbaude


otoman

Recommended Posts

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

Link to comment
Share on other sites

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 ..

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...