[ mladenvasic @ 16.05.2006. 18:30 ] @
pozdrav svima,

Potrebno mi je da u SQL Server-u 2000 napravim proceduru npr. "get_time" (koju cu kasnije pozvati iz nekog programa)
Ta procedura treba da mi selektuje sve radnike iz tabele "RADNIK" i da mi za svakog radnika izracuna
ukupno provedeno vrijeme u firmi. Vrijeme ulaza i izlaza radnika u firmi je upisano u tabelu "LOG".

Code:
Ime tabele: LOG

 id       datum       vrijeme    ui   si
--------------------------------------
00001 | 16.05.2006  | 18:23:01 |  1 |  0
00001 | 16.05.2006  | 18:28:21 |  0 |  1
00001 | 16.05.2006  | 18:33:11 |  1 |  0
00001 | 16.05.2006  | 18:45:51 |  0 |  0
00001 | 16.05.2006  | 18:53:35 |  1 |  0
00001 | 16.05.2006  | 19:00:51 |  1 |  0

Naziv,tip i opis kolona:
id      char(5)  - identifikaciona vrijednost  radnika
datum   char(10)  - datum upisa rekorda
vrijeme char(8)   - vrijeme upisa rekorda
ui      bit       - ako je 1, radnik je usao u firmu. 0, ako je izasao.
si      bit       - ako je 1, radnik je sluzbeno izasao iz firme. 0, nesluzben izlaz


Znaci,
SQL upitom treba da selektujem sve rekorde u tabeli "LOG" cija je vrijednost id-a "00001"
(naravno u tabeli "LOG se nalaze svi rekordi od svih radnika") i da za tog radnika tj. "id" dobijem
ukupno provedeno vrijeme u firmi.

Treba uzeti u obzir sledece:
1. Ako je radnik sluzbeno izasao iz firme (ako je vrijednost "ui=0" i "si=1") racuna se da je u firmi,
tj. to vrijeme je dodato ukupnom vremenu provedenom u firmi.
Npr. prva 2 rekorda u primjeru tabele, vidimo da je radnik usao u 18:23:01 (ui=1,si=0) i potom
sluzbeno izasao u 18:28:21 (ui=0,si=1).
2. Ako je radnik nesluzbeno izasao (ui=0,si=0), vrijeme provedeno van firme nije dodano ukupnom
vremenu provedenom u firmi.
Npr. 3. i 4. rekord u tabeli, poslije ulaza radnik je nesluzbeno napustio firmu (ui=0,si=0).
3. U slucaju ako dva susjedna rekorda imaju istu vrijednost ui-a npr. 1,1 ili 0,0, ta dva rekorda
se ne uzimaju u obracunavanje posto je radnik pogresno registrovan (ne moze biti dva ulaza ili dva
izlaza u dvije registracije). Npr. rekord 5 i 6 u tabeli, ulaz u 18:53:35 pa opet ulaz u 19:00:51

IMA LI KO KAKVU IDEJU KAKO DA SE OVO RIJESI, DA LI JE MOGUCE SQL-OM ILI MORAM PROGRAMSKI???
NADAM SE DA SAM DOBRO POJASNIO :-)
[ jablan @ 17.05.2006. 08:12 ] @
Evo ja ću da probam da ti dam ideju:

Napraviš temp tabelu sa jednim autoincrement (indentity) poljem i u nju ubaciš slogove sortirane po radnicima, pa po vremenu.

Uradiš JOIN na sledeću foru:
Code:
SELECT *, L2.VREME - L1.VREME AS TRAJANJE FROM #LOG L1
LEFT JOIN #LOG L2 ON (L2.ID = L1.ID + 1) AND (L2.UI = 0) AND (L1.RADNIKID = L2.RADNIKID)
WHERE
L1.UI = 1
AND L2.VREME IS NOT NULL

Tako nešto. Time računaš vreme provedeno u firmi. Na sličan način računaš i vreme provedeno službeno van firme.

Sve to skrkaš u stored proceduru i ne bi trebalo da bude problema.

[Ovu poruku je menjao jablan dana 17.05.2006. u 09:12 GMT+1]
[ mladenvasic @ 17.05.2006. 20:45 ] @
OK, hvala puno ... evo sad cu probati
Ako jos neko ima kakvu ideju neka se javi ...
[ mladenvasic @ 18.05.2006. 20:42 ] @
probao sam, nije lose ...
koliko sam zapazio ova procedura kupi iz temp tabele parove rekorda npr. 1. i 2., 3. i 4., 5. i 6. itd.,
oduzima manje od veceg vremena itd...
mana je sto za svaki par pravi novi rekord, iako je kod svih parova isti jmb radnika.
meni treba da mi sumira sva vremena prisutnosti jednog jmb pa drugog itd.

ali sve u svemu pomaze mi i ovo... uputili ste me gdje treba.

ako jos neko ima ideju neka se javi ...

i jos nesto, kako se moze sumirati citava jedna kolona tipa datetime,
sum funkcija radi samo sa brojcanim vrednostima, ako se ne varam...
[ _owl_ @ 18.05.2006. 21:33 ] @
Citat:
mladenvasic
i jos nesto, kako se moze sumirati citava jedna kolona tipa datetime,
sum funkcija radi samo sa brojcanim vrednostima, ako se ne varam...

Mozda da pretvoris u UNIX timestamp to je valjda obican broj jedino treba obratiti paznju na velicinu tipa podataka (tj. da li rezultat sabiranja moze da stane u INTEGER polje ili sta vec MS SQL ima)
[ jablan @ 19.05.2006. 07:41 ] @
Umesto prostog oduzimanja datuma na MSSQL možeš koristiti funkciju DATEDIFF
DATEDIFF(mi, vreme1, vreme2) ti daje razliku između dva vremena u minutima.
Takođe možeš nad datim upitom uraditi i grupisanje po ID radnika i SUM() nad razlikom.

Nešto kao:
Code:

SELECT L1.RADNIKID, SUM(DATEDIFF(mi, L1.VREME, L2.VREME)) AS TRAJANJE FROM #LOG L1
LEFT JOIN #LOG L2 ON (L2.ID = L1.ID + 1) AND (L2.UI = 0) AND (L1.RADNIKID = L2.RADNIKID)
WHERE
L1.UI = 1 AND L2.VREME IS NOT NULL
GROUP BY L1.RADNIKID


Eto dobio si gotov upit iako mi to nije praksa

[Ovu poruku je menjao jablan dana 19.05.2006. u 08:42 GMT+1]
[ mvasicdo @ 10.01.2007. 09:57 ] @
pozdrav, da se nadovezem na vec stariju temu.


Code:
SELECT L1.RADNIKID, SUM(DATEDIFF(mi, L1.VREME, L2.VREME)) AS TRAJANJE FROM #LOG L1
LEFT JOIN #LOG L2 ON (L2.ID = L1.ID + 1) AND (L2.UI = 0) AND (L1.RADNIKID = L2.RADNIKID)
WHERE
L1.UI = 1 AND L2.VREME IS NOT NULL
GROUP BY L1.RADNIKID


moze li se ovaj upit prepraviti tako da ako nema izlaza (tj. ako je radnik jos u firmi), da uzima trenutno vrijeme i da na osnovu vremena ulaza i ovog trenutnog vremena izravuna sumu vremena provedenog u firmi